• 1
  • 7
  • 8
  • 9
  • 10
  • 11
От мобилни телефони до цифрови камери
brum - майстор
Има си принципи, че слаботокова и силнотокова инсталация се прекарват на разстояние една от друга. Там където не може се слагат кабели с оплетка за да може да се изолира максимално комуникационните линии от захранването.

За можене - може. Но има и хардуерни решения които могат да подобрят положението. Сложи един кондензатор непосредствено в началото и края на захранващите линии към сензора в хола. 100uF електролитен + 100nF керамичен в паралел би трябвало да е достатъчно. Намали на половина и pull up резистора.

Ще погледна тези дни и ще видя дали не съм вкарал някой бъг. Отделно, че с така дадените детайли тези изчаквания от 0.2 до 1 секунда са излишни. Ще вдигна броят на опити до 20 и ще намаля времето между всеки опит до 50 милисекунди.

А и не изключвай варианта да решиш проблемите с алтернативен подход - два микроконтролера. Този дето е до термопомпата ще подава външната температура + ниската и високата на термопомпата. А в хола слагаш отделен контролер само с 1 сензор.

Та вариант има. Въпроса е да решиш кое те устройва и да действа в тази посока. Вторият микроконтролер ми се струва най-сигурното решение на мен.
radius - майстор
Заподозрях последния ред за успиването и го оставих само
delay(30000 );
Сега праща регулярно, като няма разместване на данните между датчиците , а губенето определено не е безнадеждно много, както беше с моето опростено извличане на адресите.
Прикачен файл:
е.jpg
е.jpg (106.95 KиБ) Видяна 663 пъти
Ще сложа и кондензатори и по-малък резистор и дано да се закрепи, че хич не ми се променя окабеляването.
Може ли идея как да променя кода да праща отчетите на 2 от датчиците (хол и външна) веднъж на 5 минути (т.е. 10 пъти по-рядко) ?
brum - майстор
Като остане ред ще го направя. Само дето съм гръмнал от работа и компютъра почнах да го мразя леко. Та не мога да обещая кога.

На кратко - слагаш брояч който да се увеличава с 1 при всяко минаване през loop метода (на първи ред counter++).

Там където събираш данните слагаш един

Код: Избери всички


counter = 0;

void loop() {
  counter++;
  ................
  // send data from sensor 1
  // send data from sensor 2
  if (counter == 10) {
    // send data from sensor 3
    // send data from sensor 4
    counter = 0;
  }
  ..............
radius - майстор
Мерси, няма зор, ще се опитам да го измъдря. Междувременно сложих в паралел още един 4,7кОм и се получи доста добре, за цял час само 1 пропадане на датчика в хола:

Прикачен файл:
е.jpg
е.jpg (85.38 KиБ) Видяна 648 пъти


Ще вземем да го излъжем накрая :wink:
brum - майстор
Сложи сега и кондензатори от двата края на линията :) .

Редно е да се сметне и необходимият филтър за линията за данните, ама там е по-сложно за изпълнение. А и там е хубаво с осцилоскоп да се види какво става за да се помисли как да се изчисти.
radius - майстор
А ще има ли ефект ако сложа само от края на ЕСП-то, че точно тоя датчик в хола е мамси джейс работата. Много ювелирно съм го монтирал и няма място, в краен случай ще поизкопая малко мазилка под панела, но в краен само.
Прикачен файл:
1647623428289.jpg
1647623428289.jpg (82.07 KиБ) Видяна 642 пъти
radius - майстор
Мисля че мога да приключа темата и да се похваля с успешно завършване на идеята.
Много благодаря, особено на brum, че ми даде решения на всички питания.
Не се наложи слагане на кондензатори, само с намаляване на резистора на 2,3кОм вече над седмица няма никаква загуба или объркване на данни. Всичко работи стабилно и точно както го исках, ще сложа програмката, ако някой иска да прави нещо подобно.
Този counter = 0 малко ме озори, докато се усетя да го дефинирам като integer :rolleyes: . Броячът е на 8 и с другите закъснения тъкмо идва на 5 минути.
Слагам програмката с много дребен шрифт, да не задръствам темата:

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

String apiKey = "ertyertyreyeyy"; // Enter your Write API key from ThingSpeak

const char* ssid = "gfdgdh"; // Replace with your wifi ssid and WPA2 key
const char* pass = "rtjfghjuu";
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;

uint8_t sensor_HPlow[8] = { 0x28, 0x46, 0x98, 0xFB, 0x0C, 0x00, 0x00, 0x0E };
uint8_t sensor_HPhigh[8] = { 0x28, 0x9B, 0x91, 0x87, 0x5E, 0x20, 0x01, 0x62 };
uint8_t sensor_hol[8] = { 0x28, 0x5E, 0x20, 0x8F, 0x5E, 0x20, 0x01, 0x88 };
uint8_t sensor_outside[8] = { 0x28, 0xDF, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x2B };



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("\nWiFi connected");

// Start up the library
sensors.begin();

// locate devices on the bus
Serial.printf("Found %d devices.\n\n", sensors.getDeviceCount());

DeviceAddress addr;
for (int i = 0; i < sensors.getDeviceCount(); i++) {
Serial.printf("Sensor %d address is { ", i);
sensors.getAddress(addr, i);
for (uint8_t i = 0; i < 8; i++) {
Serial.print(addr, HEX);
if (i < 7) {
Serial.print(", ");
}
}
Serial.println(" }");
}
}

float getSensor(const uint8_t* addr, const char* name) {
for (int i = 1; i < 6; i++) {
float temp = sensors.getTempC(addr);
if (temp > -125) {
return temp;
}
delay(200 * i);
sensors.requestTemperatures();
}

Serial.printf("Failed to read sensor %s.\n", name);
return -127.00;
}
int counter = 0;
void loop() {
counter++;
unsigned long start = millis();

if (WiFi.status() != WL_CONNECTED) {
Serial.printf("WiFi connection failed, current status is %d.\n", WiFi.status());
delay(100);
ESP.restart();
}

sensors.requestTemperatures();

float tempC_HPlow = getSensor(sensor_HPlow, "HPlow");
float tempC_hol = getSensor(sensor_hol, "hol");
float tempC_HPhigh = getSensor(sensor_HPhigh, "HPhigh");
float tempC_outside = getSensor(sensor_outside, "outside");

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 += "&field3=";
postStr += String(tempC_HPhigh);
if (counter == 8) {
postStr += "&field2=";
postStr += String(tempC_hol);
postStr += "&field4=";
postStr += String(tempC_outside);
counter = 0;
}

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);
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 );
}
resistbody - майстор
Аз също си поиграх с ЕСП-то за мониторинг на една самоделна ТП... още не е инсталиран де.. но ми се получи, може да взаимствам от вашия код нещо за в бъдеще...
Мога ли да коригирам данните връщани от DS-a с някакъв код ?
Колко данни може да се подават към ТингСпийк безплатно ?
Прикачен файл:
есп.jpg
brum - майстор
пет мар 25, 2022 1:30 pmradius написа:
Мисля че мога да приключа темата и да се похваля с успешно завършване на идеята.
Честито :) !

resistbody написа:
Мога ли да коригирам данните връщани от DS-a с някакъв код ?
Какво точно искаш да им коригираш? Ако са изместени с няколко градуса спрямо това което си очаквал да видиш спокойно можеш да добавиш корекция с офсет и коефициент.
resistbody - майстор
пет мар 25, 2022 9:05 pmbrum написа:

Какво точно искаш да им коригираш? Ако са изместени с няколко градуса спрямо това което си очаквал да видиш спокойно можеш да добавиш корекция с офсет и коефициент.
Офсет ми е достатъчен ама как да го добавя/извадя... може да видиш колко се разминавата показанията на снимакта а са забодени на бредборда един до друг..
  • 1
  • 7
  • 8
  • 9
  • 10
  • 11

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


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

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

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