Цикл void loop ()
- Войдите на сайт для отправки комментариев
Сб, 09/07/2016 - 21:33
Подскажите пожалуйста, что я не так делаю в цикле void loop (). Данные отправляются нормально в брокер по MQTT, а вот в Монеторе порта всего лишь 1 раз отображается температура и влажность и больше обновляются. Мне нужно что бы при открытии Монитора порта данные темп./влажн. обновлялись раз в несколько секунд.
Вот сам код:
#include <SPI.h> // Библиотека SPI шины
#include <Ethernet.h> // Ethernet библиотека
#include <PubSubClient.h> // Библиотека MQTT
#include <DHT.h> // Библиотека для датчиков DHT11/22
#define DHTPIN 2 // Номер пина, к которому подсоединен датчик
#define DHTTYPE DHT22 // Задаём тип DHT датчика
DHT dht(DHTPIN, DHTTYPE);
// Задаём mac и ip адреса в Локальной сети
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip{192, 168, 1, 74}; //ip Адрес Ethernet Shild'a Arduino
IPAddress server{192, 168, 1, 70}; //ip Адрес для MQTT Брокера
// Шапка Функции Callback (обратный вызов)
void callback(char* topic, byte* payload, unsigned int length);
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
// Функция Callback
void callback(char* topic, byte* payload, unsigned int length)
{
// Выделяем необходимое кол-во памяти для копии payload
byte* p = (byte*)malloc(length);
// Копирование payload в новый буфер
memcpy(p, payload, length);
client.publish("home/data/status/sensor", p, length);
// Освобождаем память
free(p);
}
void setup()
{
// 1 бод равно 0.8 бит/сек
// 1 бит/сек равно 1.25 бод
Serial.begin(9600); // Задаём скорость порта в БОД'ах.
Serial.println("DHT22 test!"); // Тестовое сообщ. при откр. Монитора порта
dht.begin();
Ethernet.begin(mac, ip); // Инициализируем mac, ip
}
void loop()
{
int h = dht.readHumidity(); // Переменная типа int для Влажности
int t = dht.readTemperature(); // Переменная типа int для Температуры
// Преобразуем переменные для отправки в MQTT в Брокер
char char_temp[10]; // Переменная для перевода из int в char
dtostrf(t, 3, 0, char_temp); // Перевод из int в char
char char_hum[10];
dtostrf(h, 3, 0, char_hum);
if (!client.connected())
{
if (isnan(t) || isnan(h)) // Проверка удачно ли прошло считывание с DHT22
{
Serial.println("Failed to read from DHT22"); // Не удалось прочитать DHT22
}
else
{
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}
}
if (client.connect("arduinoClient"))
{
client.publish("home/data/status/sensor/temp", char_temp); //отправляем в Брокер значения
client.publish("home/data/status/sensor/hum", char_hum);
client.subscribe("inHome/data"); // (тестовая) для отпр. данных в MajorDoMo вручную
delay(5000); // Отправка данных в Брокер раз в 5 секунд
}
}
Кто будет делать client.stop? После коннекта - client.connected() возвращает true, и поэтому вывод в монитор порта работает только до первого коннекта.
Ругется компилятор 'class PubSubClient' has no member named 'stop' / 'Класс PubSubClient' не имеет элемента с именем "стоп"
при написании client.stop();
На амперке ответил. Повторюсь: метода stop у класс PubSubClient нет, это я навскидку, по аналогии с классом Client написал. Зато есть метод disconnect.
Но я бы переписал логику loop, чтобы туда/сюда не дёргать коннект/дисконнект.
Вроде всё работает должным образом.
Что скажите про немного изменённый цикл loop:
#include <SPI.h> // Библиотека SPI шины #include <Ethernet.h> // Ethernet библиотека #include <PubSubClient.h> // Библиотека MQTT #include <DHT.h> // Библиотека для датчиков DHT11/22 #define DHTPIN 2 // Номер пина, к которому подсоединен датчик #define DHTTYPE DHT22 // Задаём тип DHT датчика DHT dht(DHTPIN, DHTTYPE); // Задаём mac и ip адреса в Локальной сети byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; IPAddress ip{192, 168, 1, 74}; //ip Адрес Ethernet Shild'a Arduino IPAddress server{192, 168, 1, 70}; //ip Адрес для MQTT Брокера // Шапка Функции Callback (обратный вызов) void callback(char* topic, byte* payload, unsigned int length); EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); // Функция Callback void callback(char* topic, byte* payload, unsigned int length) { // Выделяем необходимое кол-во памяти для копии payload byte* p = (byte*)malloc(length); // Копирование payload в новый буфер memcpy(p, payload, length); client.publish("home/data/status/sensor", p, length); // Освобождаем память free(p); } void setup() { // 1 бод равно 0.8 бит/сек // 1 бит/сек равно 1.25 бод Serial.begin(9600); // Задаём скорость порта в БОД'ах. Serial.println("DHT22 test!"); // Тестовое сообщ. при откр. Монитора порта dht.begin(); Ethernet.begin(mac, ip); // Инициализируем mac, ip } void loop() { int h = dht.readHumidity(); // Переменная типа int для Влажности int t = dht.readTemperature(); // Переменная типа int для Температуры // Преобразуем переменные для отправки в MQTT в Брокер char char_temp[10]; // Переменная для перевода из int в char dtostrf(t, 3, 0, char_temp); // Перевод из int в char char char_hum[10]; dtostrf(h, 3, 0, char_hum); if (client.connect("arduinoClient")) { if (isnan(t) || isnan(h)) // Проверка удачно ли прошло считывание с DHT22 { Serial.println("Failed to read from DHT22"); // Не удалось прочитать DHT22 } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //Отправка данных по MQTT в Брокер client.publish("home/data/status/sensor/temp", char_temp); //отправляем в Брокер значения client.publish("home/data/status/sensor/hum", char_hum); client.subscribe("inHome/data"); // (тестовая) для отпр. данных в MajorDoMo вручную delay(5000); // Отправка данных в Брокер раз в 5 секунд client.disconnect(); // Отключиться } }