Compare commits

..

No commits in common. "master" and "development" have entirely different histories.

1 changed files with 82 additions and 65 deletions

View File

@ -1,106 +1,123 @@
// In your secrets.h file, define the following:
// char ssid[] = "";
// char password[] = "";
// const char *mqttUsername = "";
// const char *mqttPassword = "";
// const int port = 1883;
// IPAddress server(192, 168, 1, 2);
#include <Bounce2.h> #include <Bounce2.h>
#include <SPI.h>
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <PubSubClient.h> #include <PubSubClient.h>
#include "secrets.h" #include "secrets.h"
const unsigned int motorPin = 14; const int feedButtonPin = 0;
const unsigned int feedButtonPin = 0; const int motorPin = 14;
const unsigned int motorSwitchPin = 12; const int motorSwitchPin = 12;
Bounce feedButtonDebounced = Bounce(); const int dispenseTimeout = 2000;
Bounce motorSwitchDebounced = Bounce(); const int debounce = 100;
const unsigned int jamTimeout = 2000; boolean motorJammed = false;
const unsigned int networkTimeout = 5000; char clientName[] = "PrawnBot-ESP";
const unsigned int debounce = 50; boolean somethingToSay = false;
const char myName[] = "PrawnBot-ESP"; String messageToReport;
const char *controlTopic = "devices/prawnbot";
char statusTopic[] = "devices/prawnbot/status";
long modeStartTime = 0; long modeStartTime = 0;
long lastWifiConnectAttempt = 0; unsigned int lastAnnounced = 5;
long lastMQTTConnectAttempt = 0;
int botMode = 0; // 0: Listening; 1: Dispensing; 2: Jam int botMode = 0; // 0: Listening; 1: Dispensing; 2: Jam
void callback(char* topic, byte* incoming, unsigned int length);
Bounce motorSwitchDebounced = Bounce();
Bounce feedButtonDebounced = Bounce();
WiFiClient wifiClient; WiFiClient wifiClient;
PubSubClient mqttClient(server, 1883, MQTTReceived, wifiClient); PubSubClient mqttclient(server, 1883, callback, wifiClient);
void MQTTReceived(char* incomingTopic, byte* incomingPayload, unsigned int payloadLength){ void callback(char* theTopic, byte* incoming, unsigned int length) {
String incomingString = String((char *)incomingPayload); String incomingMessage = String((char *)incoming);
incomingString = incomingString.substring(0, payloadLength); incomingMessage = incomingMessage.substring(0, length);
Serial.println(String(incomingTopic) + ": " + incomingString); Serial.print(String(theTopic));
if(incomingString == "ping") mqttClient.publish(incomingTopic, (char*)("pong")); Serial.print(": ");
if(incomingString == "feed" && botMode != 2) botMode = 1; //if not jammed Serial.println(incomingMessage);
if (incomingMessage == "feed") botMode = 1;
else if (incomingMessage == "ping") mqttclient.publish(topic, (char*)("pong"));
} }
void setup(){ void setup() {
pinMode(motorPin, OUTPUT); pinMode(motorPin, OUTPUT);
pinMode(feedButtonPin, INPUT_PULLUP); pinMode(feedButtonPin, INPUT_PULLUP);
pinMode(motorSwitchPin, INPUT_PULLUP); pinMode(motorSwitchPin, INPUT_PULLUP);
motorSwitchDebounced.attach(motorSwitchPin); motorSwitchDebounced.attach(motorSwitchPin);
feedButtonDebounced.attach(feedButtonPin); feedButtonDebounced.attach(feedButtonPin);
motorSwitchDebounced.interval(debounce); motorSwitchDebounced.interval(50);
feedButtonDebounced.interval(debounce); feedButtonDebounced.interval(50);
Serial.begin(115200); Serial.begin(115200);
delay(10); //wait for serial delay(10);
}
void connectWifi(){
WiFi.begin(ssid, password); WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(250);
Serial.print("-");
}
Serial.println("WiFi OK. IP: " + WiFi.localIP());
} }
boolean connectMQTT(){ void getOnline(){
if(mqttClient.connect(myName, mqttUsername, mqttPassword, statusTopic, 2, true, (char*)("offline"))){ while (WiFi.status() != WL_CONNECTED) {
mqttClient.publish(statusTopic, (byte*)("online"), 6, true); delay(500);
mqttClient.subscribe(controlTopic); Serial.print(":) ");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
if (mqttclient.connect(clientName)) {
mqttclient.publish(topic, (char*)("WiFi GO"));
mqttclient.subscribe(topic);
} }
} }
void loop(){ void loop() {
if(WiFi.status() != WL_CONNECTED){ if(WiFi.status() != WL_CONNECTED) getOnline();
if(millis() - lastWifiConnectAttempt > networkTimeout){ if (!mqttclient.connected()) mqttclient.connect(clientName);
lastWifiConnectAttempt=millis();
connectWifi();
}
} else if(!mqttClient.loop()){
if(millis() - lastMQTTConnectAttempt > networkTimeout){
lastMQTTConnectAttempt=millis();
connectMQTT();
}
}
feedButtonDebounced.update(); feedButtonDebounced.update();
motorSwitchDebounced.update(); motorSwitchDebounced.update();
switch (botMode){ mqttclient.loop(); //
if (motorJammed == true) botMode = 3;
switch (botMode) {
case 0: // Listening case 0: // Listening
if(feedButtonDebounced.fell()){ if(lastAnnounced != 0) {
Serial.println("Listening");
lastAnnounced = 0;
}
if (feedButtonDebounced.fell()){
Serial.println("Button pressed"); Serial.println("Button pressed");
botMode = 1; botMode = 1;
modeStartTime = 0;
} }
break; break;
case 1: // Dispensing case 1: // Dispensing
modeStartTime=millis(); modeStartTime=millis();
if(lastAnnounced != 1) {
Serial.println("Dispensing");
lastAnnounced = 1;
}
digitalWrite(motorPin, HIGH); digitalWrite(motorPin, HIGH);
if(motorSwitchDebounced.fell()){ if (motorSwitchDebounced.fell()){
digitalWrite(motorPin, LOW); digitalWrite(motorPin, LOW);
botMode = 0; botMode = 0;
modeStartTime = 0; modeStartTime = 0;
Serial.println("Fed"); somethingToSay = true;
mqttClient.publish(controlTopic, (char*)("fed")); messageToReport="fed";
} }
else if(millis() - modeStartTime > jamTimeout){ else if (millis() - modeStartTime > dispenseTimeout) {
botMode = 2; //jammed botMode = 3;
Serial.println("Jammed"); modeStartTime = 0;
mqttClient.publish(statusTopic, (char*)("jam"));
} }
break; break;
case 2: // Jammed
if(lastAnnounced != 2) {
Serial.println("Jammed");
lastAnnounced = 2;
}
if (messageToReport != "jam") somethingToSay = true;
motorJammed = true;
messageToReport="jam";
break;
}
if (somethingToSay) {
Serial.println("Send MQTT");
int messageLength = messageToReport.length() + 1;
char messageChar[messageLength];
messageToReport.toCharArray(messageChar, messageLength);
mqttclient.publish(topic, messageChar);
somethingToSay = false;
} }
} }