Проверка на корректность кода...
- Войдите на сайт для отправки комментариев
Вс, 17/07/2016 - 18:56
Здравствуйте, готовлю первый проект, который намерен использовать 24 часа в сутки, и важна стабильность кода. Кто хорошо разбирается в программировании, просто посмотрите код и скажите, всё ли корректно я сделал для стабильной работы? Буду очень благодарен.
Вкратце, что делает программа - Через Ethernet Shild W5100 по MQTT передаёт данные на Брокер с датчика DHT22 и выводит их в порт.
Код:
/* Скетч для вывода в Монитор порта теспературы в Цельсиях и Влажности с датчика DHT22 и отправки их по MQTT в брокер и MajorDoMo. */ #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; //Инициализируем Ethernet клиент PubSubClient client(server, 1883, callback, ethClient); //Инициализируем MQTT клиент // Функция 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 в Брокер static char char_temp[7]; // Переменная для перевода из int в char dtostrf(t, 3, 0, char_temp); // Перевод из int в char static char char_hum[7]; dtostrf(h, 3, 0, char_hum); if (client.connect("DHTClient")) //Если DHTClient подкл., то выполняется код... { 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); //Влажность delay(5000); // Отправка данных в Брокер раз в 5 секунд } } else { client.disconnect(); // иначе отключиться } }
И ещё..., компилятор выдаёт такое сообщение, по смыслу вроде нечего серьёзного, правильно ли я понимаю?)):
C:\Users\Linux\Documents\Arduino\MQTT_DHT22\MQTT_DHT22.ino:29:6: warning: unused parameter 'topic' [-Wunused-parameter] void callback(char* topic, byte* payload, unsigned int length) ^
Код чистый. Хотите гарантии что не повиснет - WDT.
Тащемта, isnan() с типом int делать нахер не нужно - всегда будет true. isnan() имеет смысл над строкой, в которой написано число. int - это по дефолту число. Из коробки.
Использование dtostrf для int не слишком жестоко? Вообще-то эта функция для float. Для int есть гораздо болии экономичная itoa.
добрый вечер взял этот скетч он у меня работает хорошо и меня всё устраивает но вот вопрос как можно добавить в этот скетч данные с фоторезистора