#include <ESP8266WiFi.
h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>
#include <SimpleTimer.h>
#include <ThingSpeak.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
// WiFi credentials
char ssid[] = "YourNetworkSSID";
char pass[] = "YourNetworkPassword";
// Blynk credentials
char auth[] = "YourAuthToken";
char blynkTemplateId[] = "YourBlynkTemplateID";
// ThingSpeak credentials
char writeAPIKey[] = "YourThingSpeakWriteAPIKey";
char thingSpeakChannelName[] = "YourThingSpeakChannelName";
// Pin definitions
#define MOTOR_PIN_FORWARD D1
#define MOTOR_PIN_BACKWARD D2
#define MOTOR_PIN_LEFT D3
#define MOTOR_PIN_RIGHT D4
#define BUZZER_PIN D5
#define LED_PIN D6
#define ULTRASOUND_TRIG_PIN D7
#define ULTRASOUND_ECHO_PIN D8
#define BATTERY_PIN A0
#define PAN_SERVO_PIN D9
#define TILT_SERVO_PIN D10
Servo panServo;
Servo tiltServo;
TinyGPSPlus gps;
SoftwareSerial ss(4, 5); // RX, TX for GPS module
SimpleTimer timer;
long previousMillis = 0;
float speedKmH = 0;
float previousLatitude = 0;
float previousLongitude = 0;
void setup() {
Serial.begin(115200);
ss.begin(9600);
Blynk.begin(auth, ssid, pass);
ThingSpeak.begin(client);
pinMode(MOTOR_PIN_FORWARD, OUTPUT);
pinMode(MOTOR_PIN_BACKWARD, OUTPUT);
pinMode(MOTOR_PIN_LEFT, OUTPUT);
pinMode(MOTOR_PIN_RIGHT, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(ULTRASOUND_TRIG_PIN, OUTPUT);
pinMode(ULTRASOUND_ECHO_PIN, INPUT);
panServo.attach(PAN_SERVO_PIN);
tiltServo.attach(TILT_SERVO_PIN);
timer.setInterval(10000L, updateSensorData); // Update sensor data every 10
seconds
timer.setInterval(1000L, calculateSpeed); // Calculate speed every second
}
void loop() {
Blynk.run();
timer.run();
while (ss.available() > 0) {
gps.encode(ss.read());
}
}
void updateSensorData() {
// Read sensor data
float distance = readUltrasoundSensor();
float batteryPercentage = readBatteryPercentage();
float latitude = gps.location.lat();
float longitude = gps.location.lng();
// Update Blynk virtual pins
Blynk.virtualWrite(V0, speedKmH); // Speed in km/h
Blynk.virtualWrite(V1, distance); // Update ultrasound sensor data
Blynk.virtualWrite(V2, batteryPercentage); // Update battery percentage
Blynk.virtualWrite(V3, latitude); // Update GPS latitude
Blynk.virtualWrite(V4, longitude); // Update GPS longitude
// Update ThingSpeak channel with GPS data
ThingSpeak.setField(1, latitude);
ThingSpeak.setField(2, longitude);
ThingSpeak.writeFields(writeAPIKey);
}
float readUltrasoundSensor() {
digitalWrite(ULTRASOUND_TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASOUND_TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASOUND_TRIG_PIN, LOW);
long duration = pulseIn(ULTRASOUND_ECHO_PIN, HIGH);
float distance = (duration * 0.0343) / 2;
return distance;
}
float readBatteryPercentage() {
int sensorValue = analogRead(BATTERY_PIN);
float voltage = sensorValue * (3.3 / 1023.0);
float batteryPercentage = (voltage / 4.2) * 100; // Assuming 4.2V max for LiPo
battery
return batteryPercentage;
}
void calculateSpeed() {
if (gps.location.isUpdated()) {
float currentLatitude = gps.location.lat();
float currentLongitude = gps.location.lng();
float distance = TinyGPSPlus::distanceBetween(previousLatitude,
previousLongitude, currentLatitude, currentLongitude);
speedKmH = (distance / 1000.0) * 3600.0; // Convert m/s to km/h
previousLatitude = currentLatitude;
previousLongitude = currentLongitude;
}
}
// Motor control functions
BLYNK_WRITE(V5) { // Forward motor speed control
int speed = param.asInt();
analogWrite(MOTOR_PIN_FORWARD, speed);
digitalWrite(MOTOR_PIN_BACKWARD, LOW);
}
BLYNK_WRITE(V6) { // Backward motor speed control
int speed = param.asInt();
analogWrite(MOTOR_PIN_BACKWARD, speed);
digitalWrite(MOTOR_PIN_FORWARD, LOW);
}
BLYNK_WRITE(V7) { // Left motor control
int state = param.asInt();
digitalWrite(MOTOR_PIN_LEFT, state);
}
BLYNK_WRITE(V8) { // Right motor control
int state = param.asInt();
digitalWrite(MOTOR_PIN_RIGHT, state);
}
// Buzzer and LED control functions
BLYNK_WRITE(V9) { // Buzzer control
int state = param.asInt();
digitalWrite(BUZZER_PIN, state);
}
BLYNK_WRITE(V10) { // LED control
int state = param.asInt();
digitalWrite(LED_PIN, state);
}
// Pan and tilt control functions
BLYNK_WRITE(V11) { // Pan control
int panAngle = param.asInt();
panServo.write(panAngle);
}
BLYNK_WRITE(V12) { // Tilt control
int tiltAngle = param.asInt();
tiltServo.write(tiltAngle);
}