2015-09-02 22:37:59 +10:00
|
|
|
// In your secrets.h file, define the following:
|
|
|
|
// const char *ssid = "";
|
|
|
|
// const char *password = "";
|
|
|
|
// const int port = 1883;
|
|
|
|
// IPAddress server(192, 168, 1, 2);
|
|
|
|
|
2015-08-31 22:47:14 +10:00
|
|
|
#include <Bounce2.h>
|
2015-08-30 17:41:01 +10:00
|
|
|
#include <ESP8266WiFi.h>
|
2015-08-30 23:31:38 +10:00
|
|
|
#include <PubSubClient.h>
|
2015-08-30 17:41:01 +10:00
|
|
|
#include "secrets.h"
|
2015-09-02 22:31:19 +10:00
|
|
|
const unsigned int motorPin = 14;
|
|
|
|
const unsigned int feedButtonPin = 0;
|
|
|
|
const unsigned int motorSwitchPin = 12;
|
|
|
|
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";
|
2015-09-02 22:37:59 +10:00
|
|
|
const char *controlTopic = "devices/prawnbot";
|
|
|
|
char statusTopic[] = "devices/prawnbot/status";
|
2015-08-30 23:31:38 +10:00
|
|
|
long modeStartTime = 0;
|
2015-09-02 22:31:19 +10:00
|
|
|
long lastWifiConnectAttempt = 0;
|
|
|
|
long lastMQTTConnectAttempt = 0;
|
2015-08-31 22:47:14 +10:00
|
|
|
int botMode = 0; // 0: Listening; 1: Dispensing; 2: Jam
|
2015-09-02 22:31:19 +10:00
|
|
|
//void callback(char* topic, byte* incoming, unsigned int length);
|
2015-08-30 17:41:01 +10:00
|
|
|
|
|
|
|
WiFiClient wifiClient;
|
2015-09-02 22:31:19 +10:00
|
|
|
PubSubClient mqttclient(server, 1883, MQTTReceived, wifiClient);
|
2015-08-30 17:41:01 +10:00
|
|
|
|
2015-09-02 22:31:19 +10:00
|
|
|
void MQTTReceived(char* incomingTopic, byte* incomingPayload, unsigned int payloadLength){
|
|
|
|
String incomingString = String((char *)incomingPayload);
|
|
|
|
incomingString = incomingString.substring(0, payloadLength);
|
|
|
|
Serial.println(String(incomingTopic) + ": " + incomingString);
|
|
|
|
if(incomingString == "ping") mqttclient.publish(incomingTopic, (char*)("pong"));
|
|
|
|
if(incomingString == "feed" && botMode != 2) botMode = 1; //if not jammed
|
2015-08-30 17:41:01 +10:00
|
|
|
}
|
|
|
|
|
2015-09-02 22:31:19 +10:00
|
|
|
void setup(){
|
2015-08-30 23:31:38 +10:00
|
|
|
pinMode(motorPin, OUTPUT);
|
2015-08-31 22:47:14 +10:00
|
|
|
pinMode(feedButtonPin, INPUT_PULLUP);
|
2015-08-30 23:31:38 +10:00
|
|
|
pinMode(motorSwitchPin, INPUT_PULLUP);
|
2015-08-31 22:47:14 +10:00
|
|
|
motorSwitchDebounced.attach(motorSwitchPin);
|
|
|
|
feedButtonDebounced.attach(feedButtonPin);
|
2015-09-02 22:31:19 +10:00
|
|
|
motorSwitchDebounced.interval(debounce);
|
|
|
|
feedButtonDebounced.interval(debounce);
|
2015-08-30 17:41:01 +10:00
|
|
|
Serial.begin(115200);
|
2015-09-02 22:31:19 +10:00
|
|
|
delay(10); //wait for serial
|
2015-08-31 22:06:38 +10:00
|
|
|
}
|
|
|
|
|
2015-09-02 22:31:19 +10:00
|
|
|
void connectWifi(){
|
|
|
|
WiFi.begin(ssid, password);
|
|
|
|
while (WiFi.status() != WL_CONNECTED){
|
|
|
|
delay(250);
|
|
|
|
Serial.print("-");
|
2015-08-30 17:41:01 +10:00
|
|
|
}
|
2015-09-02 22:31:19 +10:00
|
|
|
Serial.println("WiFi OK. IP: " + WiFi.localIP());
|
2015-08-30 17:41:01 +10:00
|
|
|
}
|
|
|
|
|
2015-09-02 22:31:19 +10:00
|
|
|
boolean connectMQTT(){
|
|
|
|
if(mqttclient.connect(myName, statusTopic, 2, true, (char*)("offline"))){
|
2015-09-02 22:51:14 +10:00
|
|
|
mqttclient.publish(statusTopic, (byte*)("online"), 6, true);
|
2015-09-02 22:31:19 +10:00
|
|
|
mqttclient.subscribe(controlTopic);
|
2015-08-30 23:31:38 +10:00
|
|
|
}
|
2015-09-02 22:31:19 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
void loop(){
|
|
|
|
if(WiFi.status() != WL_CONNECTED){
|
|
|
|
if(millis() - lastWifiConnectAttempt > networkTimeout){
|
|
|
|
lastWifiConnectAttempt=millis();
|
|
|
|
connectWifi();
|
|
|
|
}
|
|
|
|
} else if(!mqttclient.loop()){
|
|
|
|
if(millis() - lastMQTTConnectAttempt > networkTimeout){
|
|
|
|
lastMQTTConnectAttempt=millis();
|
|
|
|
connectMQTT();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
feedButtonDebounced.update();
|
|
|
|
motorSwitchDebounced.update();
|
|
|
|
switch (botMode){
|
|
|
|
case 0: // Listening
|
|
|
|
if(feedButtonDebounced.fell()){
|
|
|
|
Serial.println("Button pressed");
|
|
|
|
botMode = 1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1: // Dispensing
|
|
|
|
modeStartTime=millis();
|
|
|
|
digitalWrite(motorPin, HIGH);
|
|
|
|
if(motorSwitchDebounced.fell()){
|
|
|
|
digitalWrite(motorPin, LOW);
|
|
|
|
botMode = 0;
|
|
|
|
modeStartTime = 0;
|
|
|
|
Serial.println("Fed");
|
2015-09-02 22:51:14 +10:00
|
|
|
mqttclient.publish(controlTopic, (char*)("fed")); //3 is length
|
2015-09-02 22:31:19 +10:00
|
|
|
}
|
|
|
|
else if(millis() - modeStartTime > jamTimeout){
|
|
|
|
botMode = 2; //jammed
|
|
|
|
Serial.println("Jammed");
|
2015-09-02 22:51:14 +10:00
|
|
|
//mqttclient.publish(statusTopic, (byte*)("jam"), 3, true); //3 is length
|
|
|
|
mqttclient.publish(statusTopic, (char*)("jam"));
|
2015-09-02 22:31:19 +10:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2015-08-30 23:31:38 +10:00
|
|
|
}
|
2015-08-30 17:41:01 +10:00
|
|
|
}
|