• 1
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
От мобилни телефони до цифрови камери
torbalan - Дървен философ
Не знам приспиваш ли ESP-то.
Ако не - опитай да го приспиваш примерно за минута. Като се събуди, ще направи наново връзка с безжичната мрежа. После предава данните и се приспива.
radius - майстор
Вчера завърших проекта, засега не съвсем успешно.
Има някакъв проблем, с четенето на данните от 4-те сензора, най-вероятно ми е бъгава програмката, но първо ще попитам друго. Ето как на рандъм принцип, се визуализират данните, веднъж добре, 20 пъти зле. Може би се карат за адреси, май ще се наложи да кача програмката (ползвах някаква динамична функция, не тази с конкретните hex адреси).
Прикачен файл:
ок.jpg
ок.jpg (20.95 KиБ) Видяна 839 пъти
Прикачен файл:
зле1.jpg
зле1.jpg (26.33 KиБ) Видяна 839 пъти
Прикачен файл:
зле2.jpg
зле2.jpg (24.12 KиБ) Видяна 839 пъти

На зле1.jpg се вижда г/д, че не чете от 2 датчика, на зле2 прави впечатление, че външната темп. е отишла на мястото на връщащата вода, т.е. освен загуба на данни има и разместване.
Усещам, че кода ми търпи големи оптимизации, но все пак да попитам:

Въпреки нищожната консумация от 1mA, възможно ли е поради дълги кабели (най-дългия да е 10м), да не достига достатъчно напрежение до сензорите. Гледам, че ги дават 3-5,5в, моите са закачени към 3.3в изход на ESP-то. Всичко съм затворил и скрил качествено, и предпочитам първо да питам, преди да правя опити. Та има ли смисъл да ги пусна към 5-те волта на УСБ-то?
P.S. Измерих, на най-далечния сензор си има 3,296В без падове, та въпроса ми май получи отговор. По-късно ще пусна програмката.
Vectra - специалист
Ти нали беше с DS18B20 като датчици?
Аз вземам стойностите така:
sensors.requestTemperatures(); delay(100); i=sensors.getTempCByIndex(0); i1=sensors.getTempCByIndex(1); i2=sensors.getTempCByIndex(2);
Ползвам тези библиотеки:
#include <OneWire.h>
#include <DallasTemperature.h>
Не съм имал проблеми с нечетене и разместване
radius - майстор
Има някаква цикличност при загубата на данни - в хх:10 часа започват мизериите и в хх:40 часа се оправят данните за следващия половин час !! Когато има загуба на данни понякога има и разместване на данните, но е по-скоро епизодично.
Прикачен файл:
есп.jpg
есп.jpg (110.58 KиБ) Видяна 781 пъти


Кода ми явно е далеч от истината. Иначе така взимам данните:

sensors.requestTemperatures();
float tempC_hol = sensors.getTempCByIndex(0);
float tempC_HPhigh = sensors.getTempCByIndex(1);
float tempC_out = sensors.getTempCByIndex(2);
float tempC_HPlow = sensors.getTempCByIndex(3);

Няма дилей при мен.
Да не говорим, че за хола и външната темп. не ми е нужно да подавам през 30сек. данни, а може и през 300, но не знам как да го променя само за 2 от датчиците.
Ще кача утре програмката, ако някой му се занимава да даде акъл.
radius - майстор
Срам, не срам, качвам я в отделен пост, уж за по-прегледно:


#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>

String apiKey = "тайна"; // Enter your Write API key from ThingSpeak

const char* ssid = "тайна"; // Replace with your wifi ssid and WPA2 key
const char* pass = "голяма тайна";
const char* server = "api.thingspeak.com";

#define ONE_WIRE_BUS 4 // Data wire is connected to GPIO 4 i.e. D2 pin of nodemcu

OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices

DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature sensor

WiFiClient client;

void setup()
{
Serial.begin(9600);
delay(10);

Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);

while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");

}

void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.printf("WiFi connection failed, current status is %d", WiFi.status());
delay(100);
ESP.restart();
}
sensors.requestTemperatures();
float tempC_HPlow = sensors.getTempCByIndex(0);
float tempC_hol = sensors.getTempCByIndex(1);
float tempC_HPhigh = sensors.getTempCByIndex(2);
float tempC_outside = sensors.getTempCByIndex(3);
// float tempF = sensors.getTempFByIndex(0);
if (tempC_HPlow == -127.00) {
Serial.println("Failed to read from sensor!");
delay(1000);
} else {
Serial.print("Temperature in Celsius: ");
Serial.println(tempC_HPlow);
// Serial.print("Temperature in Fahrenheit: ");
// Serial.println(tempF);
delay(1000);
}
if (tempC_hol == -127.00) {
Serial.println("Failed to read from sensor!");
delay(1000);
} else {
Serial.print("Temperature in Celsius: ");
Serial.println(tempC_hol);
// Serial.print("Temperature in Fahrenheit: ");
// Serial.println(tempF);
delay(1000);
}
if (tempC_HPhigh == -127.00) {
Serial.println("Failed to read from sensor!");
delay(1000);
} else {
Serial.print("Temperature in Celsius: ");
Serial.println(tempC_HPhigh);
// Serial.print("Temperature in Fahrenheit: ");
// Serial.println(tempF);
delay(1000);
}
if (tempC_outside == -127.00) {
Serial.println("Failed to read from sensor!");
delay(1000);
} else {
Serial.print("Temperature in Celsius: ");
Serial.println(tempC_outside);
// Serial.print("Temperature in Fahrenheit: ");
// Serial.println(tempF);
delay(1000);
}

int timeout = 5000;
if (client.connect(server, 80)) //184.106.153.149 or api.thingspeak.com
{
String postStr = apiKey;
postStr += "&field1=";
postStr += String(tempC_HPlow);
// postStr += "&field2=";
// postStr += String(tempF);
postStr += "&field2=";
postStr += String(tempC_hol);
postStr += "&field3=";
postStr += String(tempC_HPhigh);
postStr += "&field4=";
postStr += String(tempC_outside);
postStr += "\r\n\r\n";

client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.println("Sent data to Thingspeak");

// Изчаква до 5 секунди за отговор от сървъра и извежда изважда отговора в терминала.
while (timeout > 0 && !client.available()) {
timeout -= 100;
delay(100);
}

if (!client.available()) {
Serial.println("Server did not respond");
} else {
delay(1000);
timeout -= 1000;
Serial.println("Server responded:");
Serial.println(client.readString());
}
} else {
Serial.println("Connection to thingspeak failed.");
}
client.stop();
Serial.println("Delay of 30 Sec");
// thingspeak needs minimum 30 sec delay between updates
delay(30000 - timeout);
}
Защо не опиташ с ESPEasy https://www.letscontrolit.com/wiki/index.php/ESPEasy
Аз така съм си направил няколко сензора и почти никога нямам прекъсвания
ето пример с DS18b20
Прикачен файл:
espeasy1.jpg
espeasy1.jpg (61.5 KиБ) Видяна 750 пъти

При мен работи с локален MQTT сървър и OpеnHab,но има възможност за работа с thingspeak..
brum - майстор
С getByIndex няма да сработи тази работа. Пробвай да им извадиш адресите и ги дай заедно с индексите им. И добави логика за retry ако сензора не върне данни. В момента опитваш и ако не успее просто пишеш грешка. Не е особено полезно.

А адресите са важни, защото заради тях се случва това което виждаш с разместването на сензорите.

Ако ми остане ред ще напиша това което очаквам да свърши работа.

И тая работа с timeout-ите накрая ми изглежда като аз да съм я писал. Обаче тия delay(1000) дето си разпръснал из кода саботират всичко. Тоя delay(30000 - timeout) е там за да си гарантираш, че ще изпращаш данни през максимално равни интервали от около 30 секунди. Взема се в предвид само нужното време за изпращане на данните, защото само то отнема повече от няколко десетки милисекунди. След като се появят неща като delay(1000) из кода е редно и те да се вземат в предвид накрая.
radius - майстор
Офф, тия delay 1000 ги наслагах в знак на отчаяние и не намерих оригинала преди да ги омацам.
Да, кода накрая правилно си видял, че е твой, писа ми го по назад в темата.
Тази програмка работи успешно поне 3 седмици с 3 датчика (на пробна установка, като и четвъртия беше описан, просто не беше закачен). Нямаше такива загуби на данни и адреси.
Мерси за съветите, но малко ми е трудно да пиша някакви новости, просто преписвам оттук-оттам, то и затова така работи #-o
Virtex - майстор
ср яну 05, 2022 1:46 pmbrum написа:
Сега минах на Ubiquiti и цялата им инфраструктура за менажиране на устройствата и се видях бял човек :) .
Не съм ги ползвал, но влезнаха в новините напоследък със Security Проблеми, вероятно си взел мерки :)

вт яну 11, 2022 10:48 amradius написа:
DD Wrt за моя модел няма, open wrt също, защото бил с някакъв чип на Broadcom , който не знам си какво не е open за модове.
От Англия преди време се вземаха рутери за по 6-7-8 паунда, поддържащи OpenWRT с АС връзка ( 2,4Ghz + 5Ghz ) и са относително ставащи за до 100мбит интернет. Ако някои ден приемаш гости, ще ти нося армаган :-D

Относно кода - закачаш ли го на USB адаптор, за да четеш тези принтове ? Най-лесният начин да се види дали се следва последователността на кода и дали прави това, което очакваш без наличието на display. Другият вариант е да се "мига" LED-а, за да дава състояние какво прави. Примерно едно премигване е на ред Х, 2 премигвания е на ред Х+5 и така нататък.

Макар че предложенията на brum като автор на кода са достатъчни :)
radius - майстор
Гледам на serial monitor в ардуино иде-то.
И там просто пише failed to read from sensor и толкова.
  • 1
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Тема "Онлайн температурен мониторинг" | Включи се в дискусията:


Сподели форума:

Бъди информиран. Следвай "Направи сам" във Facebook:

Намери изпълнител и вдъхновения за дома. Следвай MaistorPlus във Facebook: