Всем привет!
Сделал на ардуине термодатчик с подключением по локальной сети. Смотрим за температурой в помещении, данные с датчика забирает Zabbix, хранит у себя, выводит к нам на монитор настенный - красота. Но иногда (закономерности вывести не удалось) это чудо техники зависает. На пинги не отвечает, температуру не показывает. Индикатор на ардуине горит. Пробовал запитывать с USB-порта компа, пробовал с 2-амперной зарядки от телефона - результат один. Может зависнуть раз в 2 недели, может 2 раза в день, а потом еще неделями работать без проблем.
Arduino Nano с алиэкспресса (WAVGAT), на нее бутербродом одет шилд ENC28J60, датчик DS18B20, подтянут резистором 4.7 кОм.
Скетч странный, сразу скажу. Это первый проект и я не нашел ничего лучше, чем крутить на ардуине веб-сервер и забирать данные по HTTP. Сисадмин, чоуш ))))) Частично сам, частично копипаст с какого-то похожего проекта в инете.
Когда этот Франкенштейн работает - любой кто заходит в браузере по http://10.10.0.102 видит температуру с датчика. Сначала я подозревал что сервер мониторинга слишком часто опрашивает ардуину на предмет температуры, и увеличил задержку до 3 минут. Не помогло.
Есть подозрение что что-то с питанием и неплохо бы кормить ее не через USB, а подпаяв БП прямо на ардуину, но решил сперва спросить специалистов.
Всем спасибо!
Сделал на ардуине термодатчик с подключением по локальной сети. Смотрим за температурой в помещении, данные с датчика забирает Zabbix, хранит у себя, выводит к нам на монитор настенный - красота. Но иногда (закономерности вывести не удалось) это чудо техники зависает. На пинги не отвечает, температуру не показывает. Индикатор на ардуине горит. Пробовал запитывать с USB-порта компа, пробовал с 2-амперной зарядки от телефона - результат один. Может зависнуть раз в 2 недели, может 2 раза в день, а потом еще неделями работать без проблем.
Arduino Nano с алиэкспресса (WAVGAT), на нее бутербродом одет шилд ENC28J60, датчик DS18B20, подтянут резистором 4.7 кОм.
Скетч странный, сразу скажу. Это первый проект и я не нашел ничего лучше, чем крутить на ардуине веб-сервер и забирать данные по HTTP. Сисадмин, чоуш ))))) Частично сам, частично копипаст с какого-то похожего проекта в инете.
C++:
#include <OneWire.h>
#include <UIPEthernet.h>
byte mac[] = { 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 }; // random MAC
byte ip[] = { 10, 10, 0, 102 }; // IP address in local network
String readString = String(20);
byte addr[8];
OneWire ds(4); // пин датчика
EthernetServer server(80); // тут порт куда подключаться браузером
void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
ds.search(addr);
}
void loop()
{
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// отправляет стд ответ браузеру
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
byte data[2]; // Место для значения температуры
ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
delay(3000); // датчик меряет 1 секунду, но я поставил 3 - не могу понять почему зависает раз в пару суток
ds.reset(); // Теперь готовимся получить значение измеренной температуры
ds.write(0xCC);
ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
// Получаем и считываем ответ
data[0] = ds.read(); // Читаем младший байт значения температуры
data[1] = ds.read(); // А теперь старший
// Формируем итоговое значение:
// - сперва "склеиваем" значение,
// - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
float temperature = ((data[1] << 8) | data[0]) * 0.0625;
// ниже светодиод самой ардуины, использовал при отладке, в финальной версии оставил
if (temperature >= 32) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
// формируем саму веб-страницу с цифрами температуры
client.print(temperature);
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(10);
// close the connection:
client.stop();
}
}
Есть подозрение что что-то с питанием и неплохо бы кормить ее не через USB, а подпаяв БП прямо на ардуину, но решил сперва спросить специалистов.
Всем спасибо!