#include <WiFi.h>
#include <HTTPClient.h>
#include "ThingSpeak.h"
// WiFi Credentials (Wokwi uses guest network)
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak Channel Details
unsigned long channelID = 2907195;
const char* writeAPIKey = "5WT98MTD0LL86TNQ";
// TalkBack Command
const int talkBackID = 54505;
const char* talkBackAPIKey = "NGNOYD8HJ5PGHX5B";
// WiFi client for ThingSpeak
WiFiClient client;
// Stepper Motor Pins
#define IN1 18
#define IN2 5
#define IN3 17
#define IN4 16
// Ultrasonic Sensor Pins
#define TRIG_PIN 12
#define ECHO_PIN 13
#define OBSTACLE_DISTANCE 20 // cm
// Half-step sequence
int steps[4][4] = {
{1, 0, 1, 0},
{0, 1, 1, 0},
{0, 1, 0, 1},
{1, 0, 0, 1}
};
void setup() {
Serial.begin(115200);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected!");
ThingSpeak.begin(client);
}
void loop() {
long distance = measureDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Send distance to ThingSpeak
ThingSpeak.setField(1, distance);
int x = ThingSpeak.writeFields(channelID, writeAPIKey);
if (x == 200) {
Serial.println("✅ Data sent to ThingSpeak.");
} else {
Serial.print("❌ Failed to send data. HTTP error code: ");
Serial.println(x);
}
// Get TalkBack Command
String command = getTalkBackCommand();
if (command.length() > 0) {
Serial.print("TalkBack Command: ");
Serial.println(command);
}
if (distance < OBSTACLE_DISTANCE && distance != 0) {
stopMotor();
Serial.println("🚧 Obstacle detected – motor stopped.");
} else {
if (command == "Clockwise") {
rotateClockwise();
} else if (command == "Anticlockwise") {
rotateAntiClockwise();
} else if (command == "Stop") {
stopMotor();
Serial.println("⛔ Motor stopped via TalkBack.");
}
}
delay(15000); // ThingSpeak update interval
}
String getTalkBackCommand() {
HTTPClient http;
String commandURL = "http://api.thingspeak.com/talkbacks/" + String(talkBackID) + "/commands/execute";
commandURL += "?api_key=" + String(talkBackAPIKey);
http.begin(commandURL);
int httpCode = http.GET();
String command = "";
if (httpCode == 200) {
command = http.getString();
} else {
Serial.print("Failed to get TalkBack command. Error code: ");
Serial.println(httpCode);
}
http.end();
command.trim(); // Remove \n or extra space
return command;
}
long measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
long distance = duration * 0.034 / 2;
return distance;
}
void rotateClockwise() {
for (int i = 0; i < 4; i++) {
digitalWrite(IN1, steps[i][0]);
digitalWrite(IN2, steps[i][1]);
digitalWrite(IN3, steps[i][2]);
digitalWrite(IN4, steps[i][3]);
delay(5);
}
}
void rotateAntiClockwise() {
for (int i = 3; i >= 0; i--) {
digitalWrite(IN1, steps[i][0]);
digitalWrite(IN2, steps[i][1]);
digitalWrite(IN3, steps[i][2]);
digitalWrite(IN4, steps[i][3]);
delay(5);
}
}
void stopMotor() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}