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 по витой паре.
/* connect to mqtt server, send and recive Arduino Nano W5100 HL-58S */ #include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> const int relay1 = 2; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; byte server[] = { 192, 168, 1, 123 }; byte ip[] = { 192, 168, 1, 32 }; void callback(char* topic, byte* payload, unsigned int length) { int r,hl; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); ////****/// char receivedChar = (char)payload[0]; Serial.print(receivedChar); if(receivedChar=='1') hl = LOW; else hl = HIGH; if(String(topic)=="PowerPanel/relay1") r = relay1; //back; digitalWrite(r, hl); Serial.println(); } EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoPowerPanel")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); pinMode(relay1, OUTPUT); if (client.connect("arduinoPowerPanel")) { Serial.print("online"); client.publish("PowerPanel/relay1", "1"); client.subscribe("PowerPanel/relay1"); } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }Сразу скомпилился и заработал.
Передачу температуры добавлю позже и выложу.