Температуру на сервер mqtt получаю, но управлять реле через ардуино не получается.
В брокер приходят сообщения управления:
test/device/arduino01/rel1 ON
или
test/device/arduino01/rel1 "ON"
Не знаю как правильно должно быть, но не работает ни то ни то.
Такое ощущение, что не хватает какой то команды для того что бы ардуино принял команду и обработал ее.
Сам код взял по ссылке: http://forum.amperka.ru/threads/ardino- ... nhab.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);
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;
}
}