Счетчик тепловой энергии:)

всем привет, строю дом, скучно мозгам, решил заморочится в отоплении… купил счетчик у китайцев, пару датчиков ds18b20 и пытаюсь слепить сие чудо) пока получилось словить импульсы через pulseIn(), воду считает вроде нормально, добавил датчики температуры и расчет с float’ми и все поломалось, не правильно считает импульсы…(стало занижать) делаю на китайской Nano.

Это Си гадит! За эту неделю пятый случай на форуме!
ЗЫ: Си, с смысле, товарищ Си

1 лайк

она старенькая, уже года 3-4 валялась:)

проблема, возможно в блокирующем коде для чтения ДС18Б20. Кода же нет от вас

завтра будет код, он еще не достоен публики, надо причесать:) и я нахожусь от него в 4км:(

Надеюсь датчики будут чуть ближе, километрах в 2х всего…

1 лайк

к сожалению нет, живу в одном доме, строю другой:)

На пару с товарищем Си Плюс Плюс?

Принято с к сведению. Сочувствуем. Когда и если у Вас появится вопрос(ы), спрашивайте, не стесняйтесь.

Когда будете причесывать, убедитесь в двух вещах:

  1. Опрос датчика не вешает контроллер на 750 миллис, а делается в 2 отдельные стадии (запрос конвертации и чтение)
  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

С примерами кода