re-subscribe and refactor

Vastly simpler. Better code. Now resubscribes on reconnect, and wifi
and mutt subscriptions are discrete
This commit is contained in:
jameswood 2015-09-02 22:31:19 +10:00
parent fa2d558a51
commit 2c2d327de8
1 changed files with 74 additions and 98 deletions

View File

@ -1,122 +1,98 @@
#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 int feedButtonPin = 0; const unsigned int motorPin = 14;
const int motorPin = 14; const unsigned int feedButtonPin = 0;
const int motorSwitchPin = 12; const unsigned int motorSwitchPin = 12;
const int dispenseTimeout = 2000;
const int debounce = 100;
boolean motorJammed = false;
char clientName[] = "PrawnBot-ESP";
boolean somethingToSay = false;
String messageToReport;
long modeStartTime = 0;
unsigned int lastAnnounced = 5;
int botMode = 0; // 0: Listening; 1: Dispensing; 2: Jam
void callback(char* topic, byte* incoming, unsigned int length);
Bounce motorSwitchDebounced = Bounce();
Bounce feedButtonDebounced = Bounce(); Bounce feedButtonDebounced = Bounce();
Bounce motorSwitchDebounced = Bounce();
const unsigned int jamTimeout = 2000;
const unsigned int networkTimeout = 5000;
const unsigned int debounce = 50;
const char myName[] = "PrawnBot-ESP";
long modeStartTime = 0;
long lastWifiConnectAttempt = 0;
long lastMQTTConnectAttempt = 0;
int botMode = 0; // 0: Listening; 1: Dispensing; 2: Jam
//void callback(char* topic, byte* incoming, unsigned int length);
WiFiClient wifiClient; WiFiClient wifiClient;
PubSubClient mqttclient(server, 1883, callback, wifiClient); PubSubClient mqttclient(server, 1883, MQTTReceived, wifiClient);
void callback(char* theTopic, byte* incoming, unsigned int length) { void MQTTReceived(char* incomingTopic, byte* incomingPayload, unsigned int payloadLength){
String incomingMessage = String((char *)incoming); String incomingString = String((char *)incomingPayload);
incomingMessage = incomingMessage.substring(0, length); incomingString = incomingString.substring(0, payloadLength);
Serial.print(String(theTopic)); Serial.println(String(incomingTopic) + ": " + incomingString);
Serial.print(": "); if(incomingString == "ping") mqttclient.publish(incomingTopic, (char*)("pong"));
Serial.println(incomingMessage); if(incomingString == "feed" && botMode != 2) botMode = 1; //if not jammed
if (incomingMessage == "feed" && botMode != 2) botMode = 1; //if not jammed
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(50); motorSwitchDebounced.interval(debounce);
feedButtonDebounced.interval(50); feedButtonDebounced.interval(debounce);
Serial.begin(115200); Serial.begin(115200);
delay(10); delay(10); //wait for serial
}
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());
} }
void getOnline(){ boolean connectMQTT(){
while (WiFi.status() != WL_CONNECTED) { if(mqttclient.connect(myName, statusTopic, 2, true, (char*)("offline"))){
delay(500); mqttclient.publish(statusTopic, (char*)("online"));
Serial.print(":) "); mqttclient.subscribe(controlTopic);
}
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) getOnline(); if(WiFi.status() != WL_CONNECTED){
if (!mqttclient.connected()) mqttclient.connect(clientName); if(millis() - lastWifiConnectAttempt > networkTimeout){
feedButtonDebounced.update(); lastWifiConnectAttempt=millis();
motorSwitchDebounced.update(); connectWifi();
mqttclient.loop(); }
switch (botMode) { } else if(!mqttclient.loop()){
case 0: // Listening if(millis() - lastMQTTConnectAttempt > networkTimeout){
if(lastAnnounced != 0) { lastMQTTConnectAttempt=millis();
Serial.println("Listening"); connectMQTT();
lastAnnounced = 0; }
} } else {
if (feedButtonDebounced.fell()){ feedButtonDebounced.update();
Serial.println("Button pressed"); motorSwitchDebounced.update();
botMode = 1; switch (botMode){
modeStartTime = 0; case 0: // Listening
} if(feedButtonDebounced.fell()){
break; Serial.println("Button pressed");
botMode = 1;
case 1: // Dispensing }
modeStartTime=millis(); break;
if(lastAnnounced != 1) { case 1: // Dispensing
Serial.println("Dispensing"); modeStartTime=millis();
lastAnnounced = 1; digitalWrite(motorPin, HIGH);
} if(motorSwitchDebounced.fell()){
digitalWrite(motorPin, HIGH); digitalWrite(motorPin, LOW);
if (motorSwitchDebounced.fell()){ botMode = 0;
digitalWrite(motorPin, LOW); modeStartTime = 0;
botMode = 0; Serial.println("Fed");
modeStartTime = 0; mqttclient.publish(controlTopic, (byte*)("fed"), 3, true); //3 is length
somethingToSay = true; }
messageToReport="fed"; else if(millis() - modeStartTime > jamTimeout){
} botMode = 2; //jammed
else if (millis() - modeStartTime > dispenseTimeout) { Serial.println("Jammed");
botMode = 2; //jammed mqttclient.publish(statusTopic, (byte*)("jam"), 3, true); //3 is length
modeStartTime = 0; }
} 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;
} }
} }