2017-03-08 2 views
0

Je ne suis pas vraiment un codeur, donc je vous demande les gars, si vous savez comment pourrais-je résoudre mon problème. En arduino j'ai écrit un premier programme avec mon capteur DS18B20, qui affiche la température dans openHAB sur MQTT procotol. Deuxième programme est la même chose (openhab, mqtt) suffit de basculer la lampe, ce qui signifie que lorsque j'appuie sur le commutateur, la lampe ou la LED s'allume ou s'éteint sur la fonction de rappel dans Arduino. Séparément les deux programmes fonctionnent très bien, mais quand j'essaie de les joindre, ça ne marche pas comme je le voudrais. Il me semble que le problème est avec la fonction de boucle. Lorsque j'appuie sur ON ou OFF, parfois (rarement) je peux allumer ou éteindre la lampe. Donc, ma question est ... qu'est-ce qui ne va pas? Est-ce un problème avec loop, car arduino ne peut pas faire deux choses dans la boucle en même temps? Peut-il être résolu, je ne sais vraiment pas quoi faire ensuite. S'il vous plaît aidez-moi et merci d'avance!boucle arduino ne fonctionne pas avec deux processus

#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(); 

    } 

} 
+0

Modifier la question d'inclure le code que vous avez donc nous ne devons pas deviner – hardillb

+0

Il n'y a pas de processus ** ** Arduino. Que voulez-vous dire par * "arduino ne peut pas faire deux choses dans le même temps" *? Arduino fait chaque chose ** séquentiellement **, dans l'ordre où vous les spécifiez. –

Répondre

0

Avez-vous un échantillon de votre sortie série?

Aussi pour votre fonction reconnect(), je pense que Serial devrait être Serial1 pour votre sortie ESP8266 puisque vous avez utilisé WiFi.init (& Serial1) dans la configuration.

Dans la boucle, vous avez

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

Il boucles pour voir si le client connecté, sinon il essaie de se reconnecter. En se reconnectant, il essaie de se connecter et s'il ne le peut pas, il attend 5 secondes chaque fois qu'il ne peut pas se connecter. Cela pourrait être votre problème.

Avez-vous le code pour les deux programmes séparés?

+0

tnx pour la réponse Omar, mais comme je l'ai testé, reconnecter n'a aucun impact du tout. Le problème est tout ce que j'écris dans la fonction de boucle quand le "client.loop();" en présentation, ça arrête de fonctionner. Alors peut-être que je ne peux rien avoir d'autre en boucle quand le client. –

0

C'est le code pour DS18B20 et il fonctionne

#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(); 

     } 
    } 

Et ceci est pour lampe et ça marche aussi.

#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