MQTT получение температуры_управление реле
- Войдите на сайт для отправки комментариев
Втр, 11/12/2018 - 22:05
Подскажите знатоки, что делаю не так?
Температуру на сервер mqtt получаю, но управлять реле с ардуино не получается.
В брокер сообщения приходят:
test/device/arduino01/rel1 ON
или
test/device/arduino01/rel1 "ON"
Сам код взял по ссылке: http://forum.amperka.ru/threads/ardino-w5100-mqtt-openhab.7749/
У автора вроде бы все работало.
#include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 #define rel1_pin 13 #define rel2_pin 7 char REL1; // not sensing light, LED of"test/device/arduino01/rel1")f char REL2; // not sensing light, LED off char tmp1[10]; char tmp2[10]; char tUstav1; char StrtUstav11[3]; unsigned long loopTime; unsigned long currentTime; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress Thermometer1 = { 0x28, 0x1C, 0xC1, 0x5D, 0x06, 0x0, 0x0, 0x43 }; DeviceAddress Thermometer2 = { 0x28, 0xFF, 0xE7, 0x2C, 0xA6, 0x15, 0x01, 0xCB }; IPAddress ip(192, 168, 1, 200); IPAddress server(192, 168, 1, 9); byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; void callback(char* topic, byte* payload, unsigned int length); /* void callback(char* topic, byte* payload, unsigned int length) { } */ EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; Serial.print(topic); Serial.print(" "); String strTopic = String(topic); String strPayload = String((char*)payload); Serial.println(strPayload); if (strTopic == "test/device/arduino01/rel1") { if (strPayload == "ON"){REL1 = 1;} else if (strPayload == "OFF"){REL1 = 0;} } else if (strTopic == "test/device/arduino01/rel2") { if (strPayload == "ON") {REL2 = 1;} else if (strPayload == "OFF") {REL2 = 0;} } else if (strTopic == "test/device/arduino01/kotel1/get") { char tUstav11; tUstav11 = atoi((char*)payload); if (tUstav11 != tUstav1 ) { tUstav1 = tUstav11; } } } void reconnect() { while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoClient")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(3000); } } } void setup() { Serial.begin(9600); pinMode(rel1_pin, OUTPUT); digitalWrite(rel1_pin, LOW); pinMode(rel2_pin, OUTPUT); digitalWrite(rel2_pin, LOW); sensors.begin(); sensors.setResolution(Thermometer1, 10); sensors.setResolution(Thermometer2, 10); currentTime = millis(); loopTime = currentTime; Ethernet.begin(mac, ip); if (client.connect("arduinoClient")) { //////////////////////////////////////////////// Serial.println("online"); Serial.println("REL1"); Serial.println(REL1); client.publish("test/device/arduino01/rel1", "OFF"); client.publish("test/device/arduino01/rel2", "OFF"); client.publish("test/device/arduino01/kotel1/get", "28"); client.subscribe("test/device/arduino01/#"); } } void loop() { if (REL1 == 0) digitalWrite(rel1_pin, LOW); else if (REL1 == 1) digitalWrite(rel1_pin, HIGH); if (REL2 == 0) digitalWrite(rel2_pin, LOW); else if (REL2 == 1) digitalWrite(rel2_pin, HIGH); if ((sensors.getTempC(Thermometer2)) < tUstav1 && REL2==0) { REL2 = 1; client.publish("test/device/arduino01/rel2", "ON"); Serial.println("REL2 - ON"); } else if ((sensors.getTempC(Thermometer2)) >= tUstav1 && REL2==1) { REL2=0; client.publish("test/device/arduino01/rel2", "OFF"); Serial.println("REL2 - OFF"); } client.loop(); currentTime = millis(); sensors.requestTemperatures(); if(currentTime >= (loopTime + 15000)){ if (!client.connected()) { reconnect(); } float temperature1 = sensors.getTempC(Thermometer1); float temperature2 = sensors.getTempC(Thermometer2); dtostrf(temperature1, -2, 1, tmp1); Serial.println(tmp1); Serial.println("ok"); client.publish("test/device/arduino01/temp1",tmp1); dtostrf(temperature2, -2, 1, tmp2); client.publish("test/device/arduino01/temp2",tmp2); dtostrf(tUstav1, -2, 0, StrtUstav11); client.publish("test/device/arduino01/kotel1/get", StrtUstav11); Serial.print(StrtUstav11); //8_5 loopTime = currentTime; } }
Нашел, наконец то, работающий код.
Управление релюшками/выводами Arduino Uno по протоколу MQTT, через Ethernet шилд 5100 по витой паре.
Сразу скомпилился и заработал.
Передачу температуры добавлю позже и выложу.