• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odczyt DS18B20 i publikacja przez MQTT - zawiesza się po kilku godzinach.
#11
Zgodnie z obietnicą wrzucam ostateczną wersję kodu do odczytu DS18B20 i publikacji wyników przez MQTT:

Kod:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const byte ONEWIRE_PIN = 7;
const byte NUM_SENSORS = 4;
unsigned long teraz, ostatnio;
byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 1, 107 };
byte ip[]     = { 192, 168, 2, 200 };

#define CLIENT_ID  "arduinoZbiornik"
#define PUB_TOPIC "arduino/zbiornik/out"
#define SUB_TOPIC "arduino/zbiornik/in"
#define DELAY   1000

const byte sensorsAddress[NUM_SENSORS][8] = {
  0x28, 0xAF, 0xA8, 0x26, 0x0, 0x0, 0x80, 0x9E,
  0x28, 0x32, 0xAB, 0x26, 0x0, 0x0, 0x80, 0x2B,
  0x28, 0xFF, 0x2E, 0x63, 0xA8, 0x15, 0x1, 0x94,
  0x28, 0xFF, 0xEE, 0x5E, 0xA8, 0x15, 0x4, 0x5C
};

OneWire oneWire (ONEWIRE_PIN);

DallasTemperature sensors(&oneWire);

EthernetClient ethClient;


void callback(char* topic, byte* payload, unsigned int length) {

}


PubSubClient client(server, 1883, callback, ethClient);


void reconnect() {
  
  while (!client.connected()) {
    Serial.print("Łączę z brokerem MQTT...");


    if (client.connect(CLIENT_ID)) {
      Serial.println("connected");
      client.publish("PUB_TOPIC", "arduinoZbiornik - ONLINE");

    } else {
      Serial.print("błąd połączenia, rc = ");
      Serial.print(client.state());
      Serial.println(" kolejna próba za 5 sekund");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {

  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  delay(2000);
  sensors.requestTemperatures();
  sensors.setWaitForConversion(0);
  if (client.connect(CLIENT_ID)) {
    client.publish(PUB_TOPIC, "arduinoZbiornik - ONLINE");
  }

}

void loop() {

  teraz = millis();

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

  else if (client.connected()) {


    if ((uint32_t) (teraz - ostatnio) > DELAY)
    {

      ostatnio = teraz;

      sensors.requestTemperatures();

      for (int i = 0; i < NUM_SENSORS; i++)

      {

        char buffer[50] = { 0 };
        char num_buffer[50] = { 0 };
        char payload[50] = { 0 };

        float temperature = sensors.getTempC(sensorsAddress[i]);

        dtostrf(temperature, 5, 2, buffer);
        sprintf(num_buffer, "%d", i);

        strcat(payload, "{ id");
        strcat(payload, num_buffer);
        strcat(payload, " : ");
        strcat(payload, buffer);
        strcat(payload, " }");

        client.publish(PUB_TOPIC, payload);

      }

    }

    client.loop();

  }

}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości