Вывод показаний от счетчиков воды.

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

ученик
Сообщения: 230
Зарегистрирован: Чт фев 12, 2015 2:34 pm
Благодарил (а): 36 раз
Поблагодарили: 6 раз

Re: Вывод показаний от счетчиков воды.

Сообщение ученик » Пт фев 02, 2018 3:04 pm

ser009 писал(а):за эти деньги клиента проще nrf24 + Arduino32mini собрать
так вся проблема в том, что нужно еще городить доп. резервное питание, внешний блок записи писать код взамиодействия . а это приведет к увеличению размеров, и по времени сколько.
а здесь все в одном флаконе, и миниатюрное совершенно не видно. и ничего писать не надо. Включил и работает
server i5, OS-Ubuntu Server 16., 1-wire
php 7, AMS,broadlink rm2,rm3 mini.
ученик
Сообщения: 230
Зарегистрирован: Чт фев 12, 2015 2:34 pm
Благодарил (а): 36 раз
Поблагодарили: 6 раз

Re: Вывод показаний от счетчиков воды.

Сообщение ученик » Пт фев 02, 2018 3:08 pm

Вот китаезы продают за 1500 5 шт
https://ru.aliexpress.com/item/5PCS-FRE ... 55731.html?

*** Сообщение запрещено. Содержит контактную информацию. Сообщение похоже на спам. ***
server i5, OS-Ubuntu Server 16., 1-wire
php 7, AMS,broadlink rm2,rm3 mini.
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Вывод показаний от счетчиков воды.

Сообщение ser009 » Пт фев 02, 2018 3:57 pm

Я так понял что вам энергонезависемая память нужна.
ученик
Сообщения: 230
Зарегистрирован: Чт фев 12, 2015 2:34 pm
Благодарил (а): 36 раз
Поблагодарили: 6 раз

Re: Вывод показаний от счетчиков воды.

Сообщение ученик » Пт фев 02, 2018 4:43 pm

думаю пока, вставлять или оставить все как есть
либо купить микросхему и не парится
Сегодня На али видел объявления 1500 за 5 микросхем
server i5, OS-Ubuntu Server 16., 1-wire
php 7, AMS,broadlink rm2,rm3 mini.
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Вывод показаний от счетчиков воды.

Сообщение serghei » Пт фев 02, 2018 5:22 pm

ser009 писал(а):за эти деньги клиента проще nrf24 + Arduino32mini собрать
Так уже год как работает. Вариант с EEPROM отличный , учитывая дешевизну готового модуля. Только надо придумать алгоритм и формат записи , что бы потом легко использовать на странице с графиками.
Кстати , запись на SD-карту уже пашет пол года каждые 5 минут и размер файла не превышает 1 мегабайт на 6 графиков. ESP32 отрисовывает за 7 секунд.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
olmoro
Сообщения: 40
Зарегистрирован: Пт окт 13, 2017 9:37 pm
Откуда: Выборг
Благодарил (а): 11 раз
Поблагодарили: 12 раз

Re: Вывод показаний от счетчиков воды.

Сообщение olmoro » Чт фев 15, 2018 10:38 am

serghei писал(а):Эти микрухи уже не выпускают..
ученик писал(а):либо купить микросхему и не парится
Не парьтесь - заказывайте платы на JLCPCB. 10 штук за $2, первый заказ обещают выслать бесплатно (до НГ было так).
Делают хорошо и быстро.
Плата под DS2423p + CR2032. Можно подключить CR927. Схема на паразитное питание не рассчитана.
Понадобится диодная сборка BAT54C, пара резисторов 1М и конденсатор 100нФ, все 0603.
Размер 17 на 33 мм, плата двусторонняя, 1мм.
Geber-файлы скачайте с моего сайта. Раздел "Документация".
Инструкцию по заказу найдете по ссылке "метеостанция" в "...инструкции".
Желаю успехов.
Последний раз редактировалось olmoro Сб мар 10, 2018 7:13 pm, всего редактировалось 1 раз.
За это сообщение автора olmoro поблагодарили (всего 3):
slgeo (Чт фев 15, 2018 11:29 am) • serghei (Чт фев 15, 2018 7:08 pm) • TrDA (Ср мар 14, 2018 6:06 pm)
Рейтинг: 3.49%
Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Re: Вывод показаний от счетчиков воды.

Сообщение Misko » Пт фев 23, 2018 11:29 am

Для тех у кого делема с счетчиками воды, простой способ реализации.
1) Покупаем на али приблуду для геркона например Эту (у меня был набор датчиков для андуринщиков из 16 датчикв за 400 руб, там этих приблуд много с разными датчиками, нам нужна именно плата) стоит 29 руб + доставка
2) Идем на почту получаем. Выпаиваем геркон, припаиваем к счетчикам воды на входы где был геркон.
На плате есть светодиод который показывает когда срабатывает счетчик(горит зеленым)
Если у вас показания сразу показывает 2, значит в настройках меняйте POS на Neg или наоборот это зависит от счетчика.
3) Я использую прошивку WiFi Iot Платную, надо поставить работу с прирываниями + антидребезг
4)Прошиваем Esp8266
5)в прошивке делаем настройки, у меня такие
https://yadi.sk/i/RUoSGaoO3ShcLH
6) Пункт Impulse divider отвечает за деление показаний, я пока оставил для проверки калибровки (на датчике немного подкручивал сопротивление.
7) Записываем свои показания в ESP.
http://[ip адрес]/countset?int=X&set=Y , где X- номер канала (счетчик горячая или хододная вода), Y - желаемое значение (показания горчей или холодной воды. ВАЖНО без последнего значения, которое быстро крутится.).
третий день полет нормальный ни дребезга, ни проблем
Итого затрат менее 100 руб за два датчика + лицензия WifiIot у меня к ESP еще прикручен датчик температуры который идет на кухню и датчик протечки (соседи с переодичностью раз в год чудят по стояку.)
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Вывод показаний от счетчиков воды.

Сообщение serghei » Пт фев 23, 2018 12:52 pm

Нормальное решение. Но есть пара НО .

Хочется сделать считыватель миниатюрным.
Хочется, что бы считыватель предоставлял серверу ГОТОВОЕ число литров ( или киловатт.часов )

Любой счетчик сбрасывается без питания. Записывать в EEPROM можно, но как это реализовать ? Уже больше года ищу варианты и пока заказал все таки эти DS2324.
Большой плюс такого решения - всего три провода на ВСЕ счетчики. И длинной не ограничен - работаю через мост 1Wire-I2C.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Вывод показаний от счетчиков воды.

Сообщение serghei » Ср мар 07, 2018 8:55 am

Убил свою жабу и купил всё таки эти счетчики. Запаял на макетку один. Ни один код из примеров не захотел работать с ними . Даже какой то сканер 1Wire шины их не видит. Зато AMS на ESP32 с мостом определил адрес на УРА. Осталось только самая малость - дописать код для работы и куда то его воткнуть.
У кого нибудь есть они в наличии ? Или готовая коробочка ? Как их подключали ?
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
avp8853
Сообщения: 52
Зарегистрирован: Пт июн 09, 2017 8:39 pm
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Вывод показаний от счетчиков воды.

Сообщение avp8853 » Вс апр 08, 2018 9:33 pm

Код: Выделить всё

[spoiler=]/*
 *  avp ot 02/04/2018 23:16
 *  холодная вода
 *  горячая вода
 *  LOW — прерывание срабатывает, когда контакт переключается в значение LOW
    CHANGE — прерывание срабатывает, когда значение контакта меняется
    RISING — прерывание срабатывает, когда контакт переключается из LOW в HIGH
    FALLING — прерывание срабатывает, когда контакт переключается из HIGH в LOW
 */

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>

#define SUBSCRIBETOPIC "/KyxnyaW/#"  // топик на который подписываемся
#define PUBLISHTOPIC1 "/KyxnyaW/status" // первый публикуемый топик 
#define PUBLISHTOPIC2 "/KyxnyaW/Cold" //  публикуемый топик холодная вода
#define PUBLISHTOPIC3 "/KyxnyaW/Hot" // публикуемый топик горячая вода
#define PUBLISHTOPIC4 "/KyxnyaW/Elektro" // публикуемый топик электроэнергия

WiFiClient espClient;
PubSubClient client_MQTT (espClient);

const char* ssid =        "Network_Bel";
const char* password =    "123456678";
const char* mqtt_server = "192.168.1.80";   /// example 192.168.0.19
int mqtt_port            = 1883;

const byte interruptPin1 = 14;            //D5
const byte interruptPin2 = 12;            //D6
const byte interruptPin3 = 13;            //D7
volatile uint16_t Hot_Count, Cold_Count, Elektro_Count, Elektro_Schet, Hot_MQTT, Cold_MQTT, Elektro_MQTT; 
uint16_t Hot, Cold, Elektro, view;  
volatile byte statePin1 = HIGH;
volatile byte statePin2 = HIGH;
volatile byte statePin3 = LOW;

 
void callback(char* topic, byte* payload, unsigned int length)
{	
	//преобразуем тему(topic) и значение (payload) в строку
  payload[length] = '\0';
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  int tmp = strPayload.toInt();  
  //Исследуем что "прилетело" от сервера по подписке:
  
    if(strTopic == PUBLISHTOPIC2){ // значения холодной воды
	    Cold_MQTT = 0;
	    Cold_MQTT = tmp;		
	}   
   else if(strTopic == PUBLISHTOPIC3){ // значения горячей воды
            Hot_MQTT = 0;
            Hot_MQTT = tmp;
		}  
   else if(strTopic == PUBLISHTOPIC4){ // значения электроэнергия
            Elektro_MQTT =0;
            Elektro_MQTT = tmp;
		} 		
	   //Serial.print("Message arrived [");
	   //Serial.print(topic); 
	   //Serial.print("-");     
	   //Serial.print(tmp);
	   //Serial.println("] ");	                  
}	 

void reconnect(void)
{  
  // Loop until we're reconnected  // Bucle hasta que se vuelva a conectar
  while (!client_MQTT.connected()) {  
    if (client_MQTT.connect("ESP8266_KyxnyaWater")) {
       Serial.println("MQTT Online");        
      //// Topico para recibir Holding Registers desde MQTT // Topic to receive Holding Registers from MQTT --- return data in callback funtion
       client_MQTT.subscribe(SUBSCRIBETOPIC);          
    } else {
      //Serial.print("failed, rc=");
      //Serial.print(client_MQTT.state());    
    }
  }
}

void blink_Cold_Count(void) // Кто-то дернул прерывание 
{ 
   statePin1 = digitalRead(interruptPin1);
    if (!statePin1 && Cold_Count == 0){ //Если это D5(14 пин), то нужно добавить 10л к холодной воде. второй частью проверяем, что мы это срабатывание еще не учитывали. 
        Cold_Count = 1; // сообщаем в основной цикл, что было срабатывание геркона на холодной воде. 
    } 
    if (statePin1 && Cold_Count == 2){ //Если это D5(14 пин) перешел в ноль и при этом стоит флаг состояния "учтено", то нужно обнулить флаг, для последующего учета, при переходе в еденицу 
        Cold_Count = 0; 
    } 
} 

void blink_Hot_Count(void) // Кто-то дернул прерывание
{
   statePin2 = digitalRead(interruptPin2);
    if (!statePin2 && Hot_Count == 0){ //  D6(12 пин)делаем то же самое с горячей водой. 
        Hot_Count = 1; 
    } 
    if (statePin2 && Hot_Count == 2){  
        Hot_Count = 0; 
    } 
}

void blink_Elektro_Count(void) // Кто-то дернул прерывание
{
   statePin3 = digitalRead(interruptPin3);
    if (statePin3 && Elektro_Count == 0){ //  D7(13 пин)делаем то же самое с электросчетчиком 
        Elektro_Count = 1; 
    } 
    if (!statePin3 && Elektro_Count == 2){  
        Elektro_Count = 0; 
    } 
}

void setup(void)
{
	   pinMode (interruptPin1, INPUT_PULLUP);
	   pinMode (interruptPin2, INPUT_PULLUP);
	   pinMode (interruptPin3, INPUT_PULLUP);
	 //–Задаем  функцию blink , которая будет вызвана по внешнему прерыванию.
	   attachInterrupt ( digitalPinToInterrupt (interruptPin1), blink_Cold_Count, FALLING);
	   attachInterrupt ( digitalPinToInterrupt (interruptPin2), blink_Hot_Count, FALLING);
	   attachInterrupt ( digitalPinToInterrupt (interruptPin3), blink_Elektro_Count, RISING);
	   Serial.begin(9600);
	   delay(100); 
	   WiFi.mode(WIFI_STA);   
	   WiFi.begin(ssid, password);
	   client_MQTT.setServer(mqtt_server, mqtt_port);
	   client_MQTT.setCallback(callback);
	   delay(100);  
	   while (WiFi.waitForConnectResult() != WL_CONNECTED) {
		//Serial.println("Connection Failed! Rebooting...");
	   delay(5000);
	   ESP.restart();
	  }
	      // No authentication by default
	  //ArduinoOTA.setPassword((const char *)"123");

         // Hostname defaults to esp8266-[ChipID]
      ArduinoOTA.setHostname("CountKyxnya");    
	  
	  ArduinoOTA.onStart([]() {
		//Serial.println("Start");
	  });
	  ArduinoOTA.onEnd([]() {
		//Serial.println("\nEnd");
	  });
	  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
		//Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
	  });
	  //ArduinoOTA.onError([](ota_error_t error) {
		//  });
	  ArduinoOTA.begin();
	  //Serial.println("Ready");
	  //Serial.print("IP address: ");
	  //Serial.println(WiFi.localIP());
}

void loop(void)
{ 
	ArduinoOTA.handle();
	if (!client_MQTT.connected()) {            
         reconnect();         /// reconection MQTT
    } 
	     //Проверка входящих соединений по подписке                          
        client_MQTT.loop(); 

    if ((millis() % 700) == 0) { //каждые 700мс проверяем, что нам нужно посчитать. Т.к. считаем мы  один раз в полсекунды - дрябезг нам не страшен. 
	    //char  buf[10];
        if(Cold_Count == 1){  //если надо посчитать холодную воду         
          Cold_Count = 2; //ставим флаг в состояние "учтено"
           if(Cold == Cold_MQTT){Cold = 10;} // проверяем что прилетело в топик если последнее отправленное долетело 
		    else if(Cold > Cold_MQTT){Cold+=10;} //  если последнее отправленное не долетело то к предидушему значению добавляем 10 литров
		    else {Cold = 10;}           
            //String(Cold).toCharArray(buf, sizeof(buf));
            //client_MQTT.publish(PUBLISHTOPIC2,buf);
			client_MQTT.publish(PUBLISHTOPIC2, String(Cold).c_str());
		    view = 1;
        } 
    
		if(Hot_Count == 1){ // то же самое для горячей воды 
		  Hot_Count = 2; 
		    if(Hot == Hot_MQTT){Hot = 10;} // проверяем что прилетело в топик если последнее отправленное долетело 
		    else if(Hot > Hot_MQTT){Hot+=10;} //  если последнее отправленное не долетело то к предидушему значению добавляем 10 литров
		    else {Hot = 10;}     
		    //String(Hot).toCharArray(buf, sizeof(buf));
		    //client_MQTT.publish(PUBLISHTOPIC3,buf);
			client_MQTT.publish(PUBLISHTOPIC3, String(Hot).c_str());
            view = 1;
		} 
    }
	
	if ((millis() % 20) == 0) { //каждые 20мс проверяем  A=6400 импульсов 1 кВт при потреблении 25 кВт в час 25*6400/60*60 = 44,4   1000/45 
	    if(Elektro_Count == 1){  //60 минут умножаем на 60 секунд тем самым получаем максимальное количество импульсов в секунду       
          Elektro_Count = 2; //ставим флаг в состояние "учтено"
		    Elektro_Schet++;
			Serial.print("Elektro: "); 
            Serial.print(Elektro_Schet); 
            Serial.print("\n\r");
		    if(Elektro_Schet == 64){
            if(Elektro == Elektro_MQTT){Elektro = 1;} // проверяем что прилетело в топик если последнее отправленное долетело 
		    else if(Elektro > Elektro_MQTT){Elektro++;} //  если последнее отправленное не долетело то к предидушему значению добавляем 10
		    else {Elektro = 1;}           
            //char  buf[10];
            //String(Elektro).toCharArray(buf, sizeof(buf));
            //client_MQTT.publish(PUBLISHTOPIC4,buf);
			client_MQTT.publish(PUBLISHTOPIC4, String(Elektro).c_str()); 
		    Elektro_Schet=0;
		    view = 1;
		    }
		    else if(Elektro_Schet > 64){Elektro_Schet=0;}
        } 
	}
    if ((millis() % 600000) == 0) { //каждые 600000мс проверяем, что жив контроллер или нет 
        byte Statuss = 1;     
           //char  buf[10];
           //String(Statuss).toCharArray(buf, sizeof(buf));
           client_MQTT.publish(PUBLISHTOPIC1,String(Statuss).c_str());      
        } 
     
    if ( view == 1) { 
       //Serial.print("Hot: "); 
       //Serial.print(Hot); 
       //Serial.print("\n\r"); 
       //Serial.print(" Cold: "); 
       //Serial.println(Cold); 
       //Serial.print("\n\r"); 
       view = 0; 
    } 
}
[/spoiler]
У меня так
Ответить