04-05-2018, 22:22
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();
}
}