0

I am not much of a coder, so I am asking you guys, if you know how could I solve my problem. In arduino I wrote a first program with my DS18B20 sensor, which is displaying temperature in openHAB over MQTT procotol. Second program is the same thing (openhab, mqtt) just switch lamp, meaning that when I press the switch, the lamp or LED turns on or off over callback function in Arduino. Separately both programs works just fine, but when I am trying to join them together it doesn't work as I would like. Seems to me, that the problem is with loop function. When I press switch ON or OFF, sometimes (rarely) I can turn lamp on or off. So my question is...what is wrong? Is it problem with loop, because arduino can't procede two things in the loop in the same time? Can it be solved, I really don't know what to do next. Please help me and thanks in advance!

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <PubSubClient.h>
#include "WiFiEsp.h"

// Emulate Serial1 on pins 3/2 if not present
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(3, 2); // RX, TX
#endif

char ssid[] = "SSID;     // your network SSID (name)
char pwd[] = "password";  // your network password

float temp = 0;

byte server[] = { 192, 168, 1, 71 }; // IP Address of your MQTT Server
WiFiEspClient espClient;
PubSubClient client(espClient);


#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);



void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("Callback");

Serial.println(topic);
Serial.println(length);
Serial.write(payload,length);
Serial.println();

 if (strcmp(topic,"home/luc")==0) { 
   if (payload[0] == '0') 
    {
    digitalWrite(7, LOW);
    delay(100);
    client.publish("home/luc/state","OFF");
  }  
  else if (payload[0] == '1')
  {

  digitalWrite(7, HIGH);  
  delay(100);
  client.publish("home/luc/state","ON");
    }

}
}



void temperaturni_senzor ()
{
  sensors.requestTemperatures();  
  temp = sensors.getTempCByIndex(0);
  Serial.print("Temperatura je: ");
  Serial.println(temp); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  //Update value every 1 sec.


  client.publish("home/temperature", String(temp).c_str(),TRUE);
  delay(50);
  }
void reconnect() {
 // Loop until we're reconnected
 while (!client.connected()) {
 Serial.print("connecting to mqtt...");
 // Attempt to connect
 if (client.connect("ESP8266 client")) {
  Serial.println("connection good");
  // ... and subscribe to topic
  client.subscribe("home/luc");
 } else {
  Serial.print("failed, rc=");
  Serial.print(client.state());
  Serial.println(" try again in 5 seconds");
  // Wait 5 seconds before retrying
  delay(5000);
  }
 }
}

void setup()
{
  Serial1.begin(9600);
  Serial.begin(9600); //Begin serial communication
  WiFi.init(&Serial1);
  WiFi.begin(ssid, pwd);
  client.setServer(server, 1883);
  client.setCallback(callback);

 if (client.connect("arduinoClient")) 
  {
    Serial.println ("mqqt is connected");
     client.publish("outTopic","hsubscribello world");
      client.subscribe("home/luc");  // Subscribe to all messages for this device
      client.subscribe("home/temperature");
      }
    pinMode(7, OUTPUT);
    digitalWrite(7, LOW);
  sensors.begin();

}

void loop() 
{
 client.loop();

  if (!client.connected()) 
  {
  reconnect();
  }

     temperaturni_senzor ();

  }

}
  • Edit the question to include the code you have so we don't have to guess – hardillb Mar 08 '17 at 16:53
  • There are **no processes** in Arduino. What do you mean with *"arduino can't procede two things in the loop in the same time"*? Arduino does each thing **sequentially**, in the order you specify them. – Patrick Trentin Mar 09 '17 at 09:09

2 Answers2

0

Do you have a sample of your serial output?

Also for your reconnect() function, I think Serial should be Serial1 for your ESP8266 output since you used WiFi.init(&Serial1) in the setup.

In the loop, you have

if (!client.connected()) { reconnect(); }

It loops to see if the client connected, if not then it tries to reconnect. In reconnect it tries to connect and if it can't it waits 5 seconds each time it can't connect. This might be your issue.

Do you have the code for both separated programs?

Omar
  • 492
  • 4
  • 10
  • tnx for answer Omar, but as I tested reconnect don't have any impact at all. The problem is whatever I write in loop function when the "client.loop ();" in presented, it stop working. So maybe I can't have anything else in loop when the client.loop in in there? – janez novak Mar 10 '17 at 12:14
0

This is the code for DS18B20 and it works

#include <OneWire.h>
    #include <DallasTemperature.h>
    #include <SPI.h>
    #include <PubSubClient.h>
    #include "WiFiEsp.h"
    #ifndef HAVE_HWSERIAL1
    #include "SoftwareSerial.h"
    SoftwareSerial Serial1(3, 2); // RX, TX
    #endif


    byte server[] = { 192, 168, 1, 71 }; // IP Address of your MQTT Server



    WiFiEspClient espClient;
    PubSubClient client(espClient);


    float temp = 0;
    char ssid[] = "SSID";     // your network SSID (name)
    char pwd[] = "password";  // your network password




    #define ONE_WIRE_BUS 4
    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);
    // Pass our oneWire reference to Dallas Temperature. 
    DallasTemperature sensors(&oneWire);


    void reconnect() {
      // Loop until we're reconnected
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Attempt to connect
        if (client.connect("arduinoClient_temperature_sensor")) {
          Serial.println("connected");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }


    void setup()
    {
    Serial1.begin(9600);
    Serial.begin(9600); //Begin serial communication
    WiFi.init(&Serial1);
    WiFi.begin(ssid, pwd);
     client.setServer(server, 1883);
     sensors.begin();
    }

   void temp_senz ()
   {
    sensors.requestTemperatures();  
      temp = sensors.getTempCByIndex(0);
      Serial.print("Temperatura je: ");
      Serial.println(temp);
      client.publish("home/temperature", String(temp).c_str(),TRUE);
      delay(1000);
    } 
    void loop()
    { 
      {
      if (!client.connected()) {
        reconnect();
      }
      client.loop();
     temp_senz ();

      }
    }

And this is for lamp and it also work.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <PubSubClient.h>
#include "WiFiEsp.h"

// Emulate Serial1 on pins 7/6 if not present
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(3, 2); // RX, TX
#endif

char ssid[] = "SSID";     // your network SSID (name)
char pwd[] = "password";  // your network password


byte server[] = { 192, 168, 1, 71 }; // IP Address of your MQTT Server



WiFiEspClient espClient;
PubSubClient client(espClient);


void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("Callback");

Serial.println(topic);
Serial.println(length);
Serial.write(payload,length);
Serial.println();

 if (strcmp(topic,"home/luc")==0) { 
   if (payload[0] == '0') 
    {
    digitalWrite(7, LOW);
    delay(100);
    client.publish("home/luc/state","OFF");
  }  
  else if (payload[0] == '1')
  {

  digitalWrite(7, HIGH);  
  delay(100);
  client.publish("home/luc/state","ON");
    }

}
}


void setup()
{
  Serial1.begin(9600);
  Serial.begin(9600); //Begin serial communication
  WiFi.init(&Serial1);
  WiFi.begin(ssid, pwd);
  client.setServer(server, 1883);
  client.setCallback(callback);

 if (client.connect("arduinoClient")) 
  {
    Serial.println ("mqqt je konektan");
     client.publish("outTopic","hsubscribello world");
      client.subscribe("home/luc");  // Subscribe to all messages for this device
      }

    pinMode(7, OUTPUT);
    digitalWrite(7, LOW);

}



void loop() {

client.loop();

}

Picture of serial monitor for both examples joined together