всем привет, строю дом, скучно мозгам, решил заморочится в отоплении… купил счетчик у китайцев, пару датчиков ds18b20 и пытаюсь слепить сие чудо) пока получилось словить импульсы через pulseIn(), воду считает вроде нормально, добавил датчики температуры и расчет с float’ми и все поломалось, не правильно считает импульсы…(стало занижать) делаю на китайской Nano.
Это Си гадит! За эту неделю пятый случай на форуме!
ЗЫ: Си, с смысле, товарищ Си
она старенькая, уже года 3-4 валялась:)
проблема, возможно в блокирующем коде для чтения ДС18Б20. Кода же нет от вас
завтра будет код, он еще не достоен публики, надо причесать:) и я нахожусь от него в 4км:(
Надеюсь датчики будут чуть ближе, километрах в 2х всего…
к сожалению нет, живу в одном доме, строю другой:)
На пару с товарищем Си Плюс Плюс?
Принято с к сведению. Сочувствуем. Когда и если у Вас появится вопрос(ы), спрашивайте, не стесняйтесь.
Когда будете причесывать, убедитесь в двух вещах:
- Опрос датчика не вешает контроллер на 750 миллис, а делается в 2 отдельные стадии (запрос конвертации и чтение)
- Опрос дтчиков идет не в каждом цикле loop()
Тогда было бы Си плюс Плюс. Возможно и Плюс. Я там еще не всех товарищей из политбюро по именам знаю
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0xB8, 0x86, 0xD5, 0x33, 0x20, 0x01, 0xCA };
DeviceAddress outsideThermometer = { 0x28, 0x6F, 0xEF, 0x49, 0x30, 0x20, 0x01, 0x7E };
int temp1;
int temp2;
int a;
void setup() {
sensors.begin();
sensors.setResolution(9);
Serial.begin(9600);
attachInterrupt(0, isr, RISING); // прерывание на D2
}
uint32_t tmr;
volatile int counter = 0;
void isr() {
counter++; // импульсы считаем тут
}
void loop() {
sensors.requestTemperatures();
temp1 = sensors.getTempC(insideThermometer);
temp2 = sensors.getTempC(outsideThermometer);
if (millis() - tmr >= 1500) {
//long prd = (millis() - tmr) / counter;
a=counter;
counter = 0;
tmr = millis();
}
float cof = 64.8;
float val = ((a*40)/cof)*60;
Serial.print (" val ");Serial.println(val/1000);
Serial.print ("t1 ");
Serial.println (temp1);
Serial.print (" t2 ");
Serial.println (temp2);
float a = 1.16;
float kWt;
kWt = (val / 1000) * a * (temp1 - temp2);
Serial.print (" kWt ");Serial.println (kWt);
}```
пока получилось так, считает похоже на правду. но с датчиками температуры еще вспоминаю как это сделать
Надеюсь, Вы работаете над этим?
с опросом датчиков накосячил, запрос температуры в setup, запомнил миллис, если прошло более 750 миллисекунд, считываем температуру, запрос температуры, запомнил миллис и далее ждёмс
А что в алфавите буквы заканчиваются и букве a
приходится быть то int то float…
Плюс ещё очень много “магических” чисел - хсоздайте нужные константы для коэффициентов и пользуйтесь ими !!!
так setup выполняется один раз же вроде?
У них там все ФИО из токенов. Когда всех запомню, смогу генерировать поэтические произведения в стиле “Цы”
так и надо перед чтением в loop выдержать паузу не менее 750 миллисекунд, значит запрашиваем температуру первый раз в setup, а дальше работаем в цикле, если прошло 750 то читаем, снова запрашиваем и запоминаем миллис
750 это минимальное время, лучше реже читать, чтобы не разогревать датчик, ты уж определись как часто надо считывать
Вот тут есть описание работы с датчиком ds18b20
С примерами кода