Compare commits
7 Commits
developmen
...
master
Author | SHA1 | Date |
---|---|---|
jameswood | f655976cb1 | |
jameswood | ddb7a6a449 | |
jameswood | 4088122f1a | |
jameswood | ec1be47a6e | |
jameswood | 2c2d327de8 | |
James Wood | fa2d558a51 | |
jameswood | abce59ac11 |
147
PrawnBot-ESP.ino
147
PrawnBot-ESP.ino
|
@ -1,123 +1,106 @@
|
|||
// 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 <SPI.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <PubSubClient.h>
|
||||
#include "secrets.h"
|
||||
const int feedButtonPin = 0;
|
||||
const int motorPin = 14;
|
||||
const 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();
|
||||
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";
|
||||
const char *controlTopic = "devices/prawnbot";
|
||||
char statusTopic[] = "devices/prawnbot/status";
|
||||
long modeStartTime = 0;
|
||||
long lastWifiConnectAttempt = 0;
|
||||
long lastMQTTConnectAttempt = 0;
|
||||
int botMode = 0; // 0: Listening; 1: Dispensing; 2: Jam
|
||||
|
||||
WiFiClient wifiClient;
|
||||
PubSubClient mqttclient(server, 1883, callback, wifiClient);
|
||||
PubSubClient mqttClient(server, 1883, MQTTReceived, wifiClient);
|
||||
|
||||
void callback(char* theTopic, byte* incoming, unsigned int length) {
|
||||
String incomingMessage = String((char *)incoming);
|
||||
incomingMessage = incomingMessage.substring(0, length);
|
||||
Serial.print(String(theTopic));
|
||||
Serial.print(": ");
|
||||
Serial.println(incomingMessage);
|
||||
if (incomingMessage == "feed") botMode = 1;
|
||||
else if (incomingMessage == "ping") mqttclient.publish(topic, (char*)("pong"));
|
||||
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
|
||||
}
|
||||
|
||||
void setup() {
|
||||
void setup(){
|
||||
pinMode(motorPin, OUTPUT);
|
||||
pinMode(feedButtonPin, INPUT_PULLUP);
|
||||
pinMode(motorSwitchPin, INPUT_PULLUP);
|
||||
motorSwitchDebounced.attach(motorSwitchPin);
|
||||
feedButtonDebounced.attach(feedButtonPin);
|
||||
motorSwitchDebounced.interval(50);
|
||||
feedButtonDebounced.interval(50);
|
||||
motorSwitchDebounced.interval(debounce);
|
||||
feedButtonDebounced.interval(debounce);
|
||||
Serial.begin(115200);
|
||||
delay(10);
|
||||
delay(10); //wait for serial
|
||||
}
|
||||
|
||||
void connectWifi(){
|
||||
WiFi.begin(ssid, password);
|
||||
while (WiFi.status() != WL_CONNECTED){
|
||||
delay(250);
|
||||
Serial.print("-");
|
||||
}
|
||||
Serial.println("WiFi OK. IP: " + WiFi.localIP());
|
||||
}
|
||||
|
||||
void getOnline(){
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
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);
|
||||
boolean connectMQTT(){
|
||||
if(mqttClient.connect(myName, mqttUsername, mqttPassword, statusTopic, 2, true, (char*)("offline"))){
|
||||
mqttClient.publish(statusTopic, (byte*)("online"), 6, true);
|
||||
mqttClient.subscribe(controlTopic);
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if(WiFi.status() != WL_CONNECTED) getOnline();
|
||||
if (!mqttclient.connected()) mqttclient.connect(clientName);
|
||||
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();
|
||||
}
|
||||
}
|
||||
feedButtonDebounced.update();
|
||||
motorSwitchDebounced.update();
|
||||
mqttclient.loop(); //
|
||||
if (motorJammed == true) botMode = 3;
|
||||
switch (botMode) {
|
||||
switch (botMode){
|
||||
case 0: // Listening
|
||||
if(lastAnnounced != 0) {
|
||||
Serial.println("Listening");
|
||||
lastAnnounced = 0;
|
||||
}
|
||||
if (feedButtonDebounced.fell()){
|
||||
if(feedButtonDebounced.fell()){
|
||||
Serial.println("Button pressed");
|
||||
botMode = 1;
|
||||
modeStartTime = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // Dispensing
|
||||
modeStartTime=millis();
|
||||
if(lastAnnounced != 1) {
|
||||
Serial.println("Dispensing");
|
||||
lastAnnounced = 1;
|
||||
}
|
||||
digitalWrite(motorPin, HIGH);
|
||||
if (motorSwitchDebounced.fell()){
|
||||
if(motorSwitchDebounced.fell()){
|
||||
digitalWrite(motorPin, LOW);
|
||||
botMode = 0;
|
||||
modeStartTime = 0;
|
||||
somethingToSay = true;
|
||||
messageToReport="fed";
|
||||
Serial.println("Fed");
|
||||
mqttClient.publish(controlTopic, (char*)("fed"));
|
||||
}
|
||||
else if (millis() - modeStartTime > dispenseTimeout) {
|
||||
botMode = 3;
|
||||
modeStartTime = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: // Jammed
|
||||
if(lastAnnounced != 2) {
|
||||
else if(millis() - modeStartTime > jamTimeout){
|
||||
botMode = 2; //jammed
|
||||
Serial.println("Jammed");
|
||||
lastAnnounced = 2;
|
||||
mqttClient.publish(statusTopic, (char*)("jam"));
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue