Improve offline responsiveness

hard-wired button checking is no longer inside the wifi loop - the
button now works even if the network (or mqtt broker) drops out
This commit is contained in:
jameswood 2015-09-27 15:36:36 +10:00
parent ddb7a6a449
commit f655976cb1
1 changed files with 36 additions and 37 deletions

View File

@ -1,6 +1,8 @@
// In your secrets.h file, define the following: // In your secrets.h file, define the following:
// const char *ssid = ""; // char ssid[] = "";
// const char *password = ""; // char password[] = "";
// const char *mqttUsername = "";
// const char *mqttPassword = "";
// const int port = 1883; // const int port = 1883;
// IPAddress server(192, 168, 1, 2); // IPAddress server(192, 168, 1, 2);
@ -23,16 +25,15 @@ long modeStartTime = 0;
long lastWifiConnectAttempt = 0; long lastWifiConnectAttempt = 0;
long lastMQTTConnectAttempt = 0; 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);
WiFiClient wifiClient; WiFiClient wifiClient;
PubSubClient mqttclient(server, 1883, MQTTReceived, wifiClient); PubSubClient mqttClient(server, 1883, MQTTReceived, wifiClient);
void MQTTReceived(char* incomingTopic, byte* incomingPayload, unsigned int payloadLength){ void MQTTReceived(char* incomingTopic, byte* incomingPayload, unsigned int payloadLength){
String incomingString = String((char *)incomingPayload); String incomingString = String((char *)incomingPayload);
incomingString = incomingString.substring(0, payloadLength); incomingString = incomingString.substring(0, payloadLength);
Serial.println(String(incomingTopic) + ": " + incomingString); Serial.println(String(incomingTopic) + ": " + incomingString);
if(incomingString == "ping") mqttclient.publish(incomingTopic, (char*)("pong")); if(incomingString == "ping") mqttClient.publish(incomingTopic, (char*)("pong"));
if(incomingString == "feed" && botMode != 2) botMode = 1; //if not jammed if(incomingString == "feed" && botMode != 2) botMode = 1; //if not jammed
} }
@ -58,9 +59,9 @@ void connectWifi(){
} }
boolean connectMQTT(){ boolean connectMQTT(){
if(mqttclient.connect(myName, statusTopic, 2, true, (char*)("offline"))){ if(mqttClient.connect(myName, mqttUsername, mqttPassword, statusTopic, 2, true, (char*)("offline"))){
mqttclient.publish(statusTopic, (byte*)("online"), 6, true); mqttClient.publish(statusTopic, (byte*)("online"), 6, true);
mqttclient.subscribe(controlTopic); mqttClient.subscribe(controlTopic);
} }
} }
@ -70,38 +71,36 @@ void loop(){
lastWifiConnectAttempt=millis(); lastWifiConnectAttempt=millis();
connectWifi(); connectWifi();
} }
} else if(!mqttclient.loop()){ } else if(!mqttClient.loop()){
if(millis() - lastMQTTConnectAttempt > networkTimeout){ if(millis() - lastMQTTConnectAttempt > networkTimeout){
lastMQTTConnectAttempt=millis(); lastMQTTConnectAttempt=millis();
connectMQTT(); connectMQTT();
} }
} else { }
feedButtonDebounced.update(); feedButtonDebounced.update();
motorSwitchDebounced.update(); motorSwitchDebounced.update();
switch (botMode){ switch (botMode){
case 0: // Listening case 0: // Listening
if(feedButtonDebounced.fell()){ if(feedButtonDebounced.fell()){
Serial.println("Button pressed"); Serial.println("Button pressed");
botMode = 1; botMode = 1;
} }
break; break;
case 1: // Dispensing case 1: // Dispensing
modeStartTime=millis(); modeStartTime=millis();
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"); Serial.println("Fed");
mqttclient.publish(controlTopic, (char*)("fed")); //3 is length mqttClient.publish(controlTopic, (char*)("fed"));
} }
else if(millis() - modeStartTime > jamTimeout){ else if(millis() - modeStartTime > jamTimeout){
botMode = 2; //jammed botMode = 2; //jammed
Serial.println("Jammed"); Serial.println("Jammed");
//mqttclient.publish(statusTopic, (byte*)("jam"), 3, true); //3 is length mqttClient.publish(statusTopic, (char*)("jam"));
mqttclient.publish(statusTopic, (char*)("jam")); }
} break;
break;
}
} }
} }