diff --git a/arduino/MQTT/MQTT.ino b/arduino/MQTT/MQTT.ino index e33233c..10100d9 100644 --- a/arduino/MQTT/MQTT.ino +++ b/arduino/MQTT/MQTT.ino @@ -4,12 +4,10 @@ #include #include #include "certificate.h" -#include "secrets.h" - +#include "secret.h" #define CERT mqtt_broker_cert #define MSG_BUFFER_SIZE (50) - const char* ssid = VITRINE_SSID; const char* password = VITRINE_WIFI_PASS; const char* mqtt_server = "mqtt.klank.school"; // eg. your-demo.cedalo.cloud or 192.168.1.11 @@ -17,60 +15,106 @@ const uint16_t mqtt_server_port = 7000; // or 8883 most common for tls t const char* mqttUser = MQTT_ARDUINO_USERNAME; const char* mqttPassword = MQTT_ARDUINO_PASS; -bool isOn = false; +#define MAIN_CHANNEL "main/#" -#define MAIN_CHANNEL "main" - - -#define RELAY_1 1 -//-------------------------------------- -// globals -//-------------------------------------- -#ifdef MQTT_TLS -WiFiClientSecure wifiClient; -#else WiFiClient wifiClient; -#endif WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); PubSubClient mqttClient(wifiClient); +#if hasRelayShield +const int RELAY_PIN_FAN1 = 1; +const int RELAY_PIN_FAN2 = 2; +const int RELAY_PIN_RADIO1 = 3; +const int RELAY_PIN_LAMP1 = 4; +const int RELAY_PIN_LAMP2 = 5; +// const int RELAY_PIN = 6; +// const int RELAY_PIN = 7; +// const int RELAY_PIN = 8; +#endif -void setup_wifi() { +#if hasMotorshield +#include +Adafruit_MotorShield AFMS = Adafruit_MotorShield(); +Adafruit_DCMotor* motor1 = AFMS.getMotor(1); +Adafruit_DCMotor* motor2 = AFMS.getMotor(2); +Adafruit_DCMotor* motor3 = AFMS.getMotor(3); +Adafruit_DCMotor* motor4 = AFMS.getMotor(4); - delay(10); - Serial.println(); - Serial.print("Connecting to "); - Serial.println(ssid); +void movePrinter(String topic, int payload) { - WiFi.begin(ssid, password); - Serial.println("start while"); - while (WiFi.status() != WL_CONNECTED) { - delay(50); - Serial.print("."); + if (topic.indexOf("speed") > 0) { + if (topic.indexOf("printer/one") > 0) { + motor1->setSpeed(payload); + } else if (topic.indexOf("printer/two") > 0) { + motor2->setSpeed(payload); + } else if (topic.indexOf("printer/three") > 0) { + motor3->setSpeed(payload); + } else if (topic.indexOf("printer/four") > 0) { + motor4->setSpeed(payload); + } + } else { + if (payload == 0) { + payload = 4; + } + + if (topic.indexOf("printer/one") > 0) { + motor1->run(payload); + } else if (topic.indexOf("printer/two") > 0) { + motor2->run(payload); + } else if (topic.indexOf("printer/three") > 0) { + motor3->run(payload); + } else if (topic.indexOf("printer/four") > 0) { + motor4->run(payload); + } } - Serial.println("i am here 1"); - timeClient.begin(); - - Serial.println("WiFi connected"); } +#endif -void callback(char* topic, byte* payload, unsigned int length) { +#if hasRelayShield +void togglePower(int pin, int payload) { + bool state = false; + if (payload > 1) { + state = true; + } + + digitalWrite(pin, state); + delay(500); +} +#endif + +void callback(char* topic, uint8_t* payload, unsigned int length) { + String t(topic); + Serial.println(); Serial.print("Message arrived on topic: '"); Serial.print(topic); Serial.print("' with payload: "); - for (unsigned int i = 0; i < length; i++) { - Serial.print((char)payload[i]); - } + String message = ""; - if (isOn) { - digitalWrite(RELAY_1, HIGH); - isOn = false; - } else { - digitalWrite(RELAY_1, LOW); - isOn = true; + for (unsigned int i = 0; i < length; i++) { + message += (char)payload[i]; } - Serial.println(); + Serial.println(message); + +#if hasMotorshield + if (t.indexOf("/printer/") > 0) { + movePrinter(t, message.toInt()); + } +#endif + +#if hasRelayShield + if (t.indexOf("/fan/one") > 0) { + togglePower(RELAY_PIN_FAN1, message.toInt()); + } else if (t.indexOf("/fan/two") > 0) { + togglePower(RELAY_PIN_FAN2, message.toInt()); + } else if (t.indexOf("/radio/one") > 0) { + togglePower(RELAY_PIN_RADIO1, message.toInt()); + } else if (t.indexOf("/lamp/one") > 0) { + togglePower(RELAY_PIN_LAMP1, message.toInt()); + } else if (t.indexOf("/lamp/two") > 0) { + togglePower(RELAY_PIN_LAMP2, message.toInt()); + } +#endif } @@ -78,12 +122,13 @@ void connect() { while (!mqttClient.connected()) { Serial.print("Attempting MQTT connection..."); - String clientId = "ESP8266Client-"; + String clientId = arduinoName; + clientId += String(random(0xffff), HEX); if (mqttClient.connect(clientId.c_str(), mqttUser, mqttPassword)) { Serial.println("connected"); mqttClient.subscribe(MAIN_CHANNEL); - mqttClient.publish(MAIN_CHANNEL, ("Whaddup can i stay? ")); + mqttClient.publish("main/hello", ("A wild arduino appeared")); } else { Serial.print("failed, rc="); Serial.print(mqttClient.state()); @@ -93,15 +138,50 @@ void connect() { } } - - void setup() { - Serial.begin(9600); + Serial.begin(115200); Serial.println("run setup"); - setup_wifi(); - Serial.println("finish setup_wifi"); - pinMode(RELAY_1, OUTPUT); + Serial.print("Connecting to "); + Serial.println(ssid); +#if hasRelayShield + pinMode(RELAY_PIN_FAN1, OUTPUT); + pinMode(RELAY_PIN_FAN2, OUTPUT); + pinMode(RELAY_PIN_RADIO1, OUTPUT); + pinMode(RELAY_PIN_LAMP1, OUTPUT); + pinMode(RELAY_PIN_LAMP2, OUTPUT); +#endif + +#if hasMotorshield + Serial.println("i have a motorshield"); + if (!AFMS.begin()) { + Serial.println("Could not find Motor Shield. Check wiring."); + while (1) + ; + }; + + motor1->setSpeed(160); + motor1->run(RELEASE); + motor2->setSpeed(160); + motor2->run(RELEASE); + motor3->setSpeed(160); + motor3->run(RELEASE); + motor4->setSpeed(160); + motor4->run(RELEASE); +#endif + + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(50); + Serial.print("."); + } + Serial.println("----"); + Serial.println("WiFi connected"); + Serial.println("----"); + + timeClient.begin(); + Serial.println("finish setup_wifi"); mqttClient.setServer(mqtt_server, mqtt_server_port); mqttClient.setCallback(callback); } diff --git a/arduino/MQTT/readme.md b/arduino/MQTT/readme.md new file mode 100644 index 0000000..216ad02 --- /dev/null +++ b/arduino/MQTT/readme.md @@ -0,0 +1,24 @@ +# Running the Arduino side +The arduino listens to MQTT messages, and acts accordingly. Each arduino can serve a different purpose, for instance, running motor shields, or turning a fan on/off. + + + +### 1. Create your own "secret.h" file, following this format + +```C++ +#define VITRINE_SSID ""; +#define VITRINE_WIFI_PASS "" +#define MQTT_ARDUINO_USERNAME "" +#define MQTT_ARDUINO_PASS "" +``` + +### 2. Select your board to compile with. As I always forget which boards to select, here's my cheat sheet: + +| Arduino | Board | +| ------------- | ------------- | +| ArduinoWifi | LOLIN(WeMos) D1 R1 | +| ... | ... | + +### 3. Do something with the make files + + arduino-cli compile -b arduino:avr:uno --build-property "build.extra_flags=\"-DMY_DEFINE=\"hello world\"\"" /home/user/Arduino/MySketch diff --git a/rule-listener/data.py b/rule-listener/data.py index a4cf49b..ded5ceb 100644 --- a/rule-listener/data.py +++ b/rule-listener/data.py @@ -1,10 +1,10 @@ rules = { - "main/fan/1": [ + "main/fan/one": [ { # after the fan has been on 2 times, another fan should be turned on "count": 2, # the amount of times "state": "on", # it has had this state - "doTopic": "main/fan/2", # i will send to topic + "doTopic": "main/fan/two", # i will send to topic "doMessage": "on", # this message "delay": False, # after this amount of seconds "reset": True, # and i should reset my count afterwards @@ -12,7 +12,7 @@ rules = { { # After the fan is turned off, the next fan should be turned on "count": 4, # the amount of times "state": "off", # it has had this state - "doTopic": "main/fan/2", # i will send to topic + "doTopic": "main/fan/two", # i will send to topic "doMessage": "on", # this message "delay": 4, # after this amount of seconds "reset": True, # and i should reset my count afterwards @@ -20,7 +20,7 @@ rules = { { # Turn the fan off every time after 1 minute "count": False, # the amount of times. If its false, just do it. "state": "on", # it has had this state - "doTopic": "main/fan/1", # i will send to topic + "doTopic": "main/fan/one", # i will send to topic "doMessage": "off", # this message "delay": 4, # after this amount of seconds "reset": False, # and i should reset my count afterwards @@ -28,7 +28,7 @@ rules = { { # Turn the fan on every time after 6 minute "count": 3, # the amount of times. If its false, just do it. "state": "on", # it has had this state - "doTopic": "main/fan/1", # i will send to topic + "doTopic": "main/fan/one", # i will send to topic "doMessage": "off", # this message "delay": 360, # after this amount of seconds "reset": False, # and i should reset my count afterwards @@ -36,7 +36,7 @@ rules = { { # Every 5 minutes, do gesture X "count": 1, "state": "on", - "doTopic": "gesture/fan/1", + "doTopic": "gesture/fan/one", "doMessage": "on", "delay": 5 * 60, "reset": True