include relay stuff

This commit is contained in:
vitrinekast 2024-10-29 14:46:41 +01:00
parent b1c2eedde5
commit 5e1bdac09e
3 changed files with 158 additions and 54 deletions

View File

@ -4,12 +4,10 @@
#include <NTPClient.h>
#include <WiFiUdp.h>
#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.h>
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);
}

24
arduino/MQTT/readme.md Normal file
View File

@ -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

View File

@ -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