MQTT получение температуры_управление реле

vovankin
Offline
Зарегистрирован: 11.10.2014

Подскажите знатоки,  что делаю не так?

Температуру на сервер 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;
    }
    }

 

vovankin
Offline
Зарегистрирован: 11.10.2014

Нашел, наконец то, работающий код.

Управление релюшками/выводами 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();
}

Сразу скомпилился и заработал.

Передачу температуры добавлю позже и выложу.