Ви не увійшли.
В этой теме хочу рассказать про проект, который изначально делался просто для себя, но решение получилось удачным и теперь я готов поделиться с другими.
TL;DR: исходников в теме не будет
Примерно лет 10 назад ко мне попали датчики температуры DS18B20, работающие по протоколу 1-wire, наставил их везде, и в квартире, и на улице, и на стояки холодной и горячей воды. Мне очень понравился протокол: всего два провода (данные и земля), питание по линии данных (паразитное), к одному мастеру подключается куча устройств. Почитал, какие еще устройства работают по этому протоколу, из полезных для умного дома оказалось не так много: ADC, GPIO, Counter. ADC - незаменимая штука для работы с аналоговыми датчиками, например на нем собрал схему с датчиком влажности от Honeywell, GPIO - позволяет как подключать реле, так и работать на вход, Counter - с его помощью можно было бы снимать показания со счетчиков электроэнергии, воды, отопления. Почему можно было бы? Микросхему (DS2423) в то время я нигде достать не смог, позже узнал, что она уже не производится. Сейчас на али ее можно заказать по цене от 100грн, вероятно это из старых запасов.
Не так давно я увлекся AVR и как-то случайно нашел программную реализацию подчиненного устройства 1-wire (кому нужны подробности, называется owslave3d), в которой был пример реализации DS2423. Естественно все было скомпилировано и запущено, устройство определилось как DS2423! Но, как и оригинальная микросхема, оно требовало на счетном входе цифровой сигнал, а для аналоговых датчиков, того же фототранзистора, нужно городить схему с компараторами и делителями на подстроечных резисторах. Во-торых, ток потребления был порядка 1мА, от батарейки надолго не оставишь работать, нужно хотя-бы 10мкА. И в третьих, были глюки в работе - устройство отвечало ровно через раз. Поэтому я решил написать с нуля свою реализацию с блэкджеком и ... короче с вышеперечисленными фишечками.
Примерно полгода с первой реализации примерно вот такое устройство считало импульсы с моего счетчика ээ, периодически допиливал прошивку и несколько раз менял схему, каждый раз убирая из нее "лишнее". В результате из обвязки МК осталось 4 детали, включая батарейку:
Вот так выглядит страничка конфигурирования устройства
Подключение счетных датчиков, в том числе аналоговых, также по принципу минимизации обвязки: фототранзистор, инфракрасный отражатель - напрямую к выводам GND,A,B,PWR. Энергопотребления, даже с подключенными потребляющими датчиками, удалось достичь 5-15мкА.
Реализация, на мой взгляд, получилась удачная. Читая в различных статьях по умному дому, как люди ищут способ снимать показания со счетчиков, перечисляют несколько решений и выбирают подходящее для себя, понял, что мое устройство вполне могло бы конкурировать с другими решениями. Заказал в Китае печатные платы и сейчас устройство приобрело товарный вид.
Для начала посмотрю, будет ли пользоваться спросом, если да, то у меня появилось куча новых идей для новых устройств, например по 1-wire с МК можно по ИК (как с пульта ДУ) управлять различными домашними устройствами. У меня дома стоит счетчик отопления Multical, у него есть UART интерфейс, можно было бы для него сделать плату расширения (там предусмотрено подключение плат расширения) и по 1-wire читать с него данные напрямую.
Неактивний
Зарезервированный комментарий, сюда буду переносить важную информацию для быстрого доступа, если тема разрастется.
Буду рад ответить на вопросы связанные с подключением и настройкой счетчика.
UPD:
Счетчик импульсов уже можно приобрести в магазине arduino.ua
https://arduino.ua/prod4180-schetchik-i … -v-ykraine
Остання редакція Honey (2020-10-30 10:06:32)
Неактивний
Kaka, если Вы хотите бесплатно, то найдите на гитхабе по запросу owslave, выберите понравившуюся реализацию и переделайте под себя. Если Вы хотите кошерно, то купите на али оригинальную микросхему, компараторы, закажите плату и спаяйте, схем полно. Я могу Вам предложить только уже готовое свое устройство по бюджету, в который обойдется второй вариант.
Неактивний
Послушай, Мёд, ты заметил, что это раздел называется "Проекты" а вовсе не "Реклама" (которая здесь запрещена, кстати). Здесь делятся наработками с коллегами по хобби в порядке взаимообучения и обмена опытом, а не барыжат!
Неактивний
Я тему открыл для того, чтобы увлекающиеся люди, у которых возникает задача "как снять показания со счетчиков в системах умный дом?", знали, что есть еще и такое решение, могли подсказать его другим. Уверен, что многие будут благодарны.
Барыжат те, кто покупает готовое устройство в Китае и перепродает его тут. В данном случае это устройство - полностью мой проект, я его программировал и паял.
Kaka, судя по вашим комментариям на этом форуме в других темах, Вы здесь занимаетесь не тем, что делитесь наработками с коллегами, а занимаетесь троллингом.
Неактивний
Добрый день! Купил 2 шт Ваших девайсов. Не сканируются по шине OneWire. Что делать?
Добрый день! Купил 2 шт Ваших девайсов. Не сканируются по шине OneWire. Что делать?
Ответил по почте, продублирую и здесь тоже:
1. Должна быть вставлена батарейка CR2032 (не аккумулятор LIR2032, а именно батарейка, напряжение на батарейке должно быть до 3.6V), наличие батарейки является обязательным.
2. Для начала запитайте счетчик по линии VCC, напряжение питания должно быть в пределах 4.5-5.5 V
3. На линии DQ также должно быть напряжение 4.5-5.5 V, резистор подтяжки в данном случае подойдет любой, если есть, используйте 1кОм
Если при таком подключении счетчик определяется, можно пробовать отключать VCC и пробовать питать паразитно.
Неактивний
Для Kirill:
Для Вашего ESP8266
https://www.espruino.com/OneWire
и библиотека для счетчика:
DS2423.js
/*
Module for the DS2423 dual channel counter
```
var ow = new OneWire(A1);
var cnt = require("DS2423").connect(ow);
var A = cnt.getCounter(0);
var B = cnt.getCounter(1);
var cnt2 = require("DS2423").connect(ow, 1);
var cnt3 = require("DS2423").connect(ow, 7302954342158582045);
```
*/
var C = {
READ_MEM_COUNTER: 0xa5
};
function DS2423(oneWire, device) {
this.bus = oneWire;
if (device === undefined) {
this.sCode = this.bus.search()[0];
} else {
if (parseInt(device).toString()==device && device >= 0 && device <= 126) {
this.sCode = this.bus.search()[device];
} else {
this.sCode = device;
}
}
if (!this.sCode) throw new Error("No DS2423 found");
this.type=parseInt(this.sCode[0]+this.sCode[1]);
}
/** Return true if this device is still connected to the OneWire Bus */
DS2423.prototype.isPresent = function () {
return this.bus.search().indexOf(this.sCode) !== -1;
};
/** For internal use - check crc16 of the buf */
DS2423.prototype._check_crc16 = function (buf) {
var crc = 0;
var oddparity = [0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0];
for (var i=0;i<buf.length;i++) {
var cdata = buf[i];
cdata = (cdata^crc)&0xff;
crc >>= 8;
if (oddparity[cdata&0x0f] ^ oddparity[cdata>>4])
crc ^= 0xc001;
cdata <<= 6;
crc ^= cdata;
cdata <<= 1;
crc ^= cdata;
}
return crc==0xb001;
};
/** Get counter, num = 0 corresponds to A, num = 1 corresponds to B
If the CRC fails, 'null' will be returned */
DS2423.prototype.getCounter = function(num) {
var buf = [C.READ_MEM_COUNTER, num?0xff:0xdf, 0x01];
this.bus.select(this.sCode);
this.bus.write(buf);
buf = buf.concat((this.bus.read(11));
// buf[3] - last byte of page, buf[4..7] - 32 bit counter,
// buf[8..11] - zeroes, buf[12..13] - crc16
if (this.bus._check_crc16(buf))
return buf[4] | (buf[5]<<8) | (buf[6]<<16) | (buf[7]<<24);
return null;
}
/** Initialise a DS2423 device. Use either as:
connect(new OneWire(pin)) - use the first found DS2423 device
connect(new OneWire(pin), N) - use the Nth DS2423 device
connect(new OneWire(pin), ID) - use the DS2423 device with the given ID
*/
exports.connect = function(oneWire, device) {
return new DS2423(oneWire, device);
};
Не тестировал - не на чем, отпишитесь о результатах.
Неактивний
Классный проект. В 2012 году купил в США
плату на DS2423. За 10 лет даже батарейку
не менял. Но задумался о том, как жить дальше
без DS2423, если нужен подсчет импульсов.
Рад, что кто-то реализовал счетчик
на ATTiny и теперь за 200 грн можно забыть
о проблеме низкого энергопотребления в счетчиках
импульсов, так как все уже решено. Спасибо!
При случае куплю парочку таких милых счетчиков.
P.S. Продажа своего продукта это не реклама чужого с целью наживы, и не барыжничество. Это скорее информирование о проделанной работе, которая доведена до коммерческого продукта. Это уже разработка и производство.
Этим гордиться нужно, а не прятать,
чтоб никто не нашел.
Неактивний
Для Вашего ESP8266
https://www.espruino.com/OneWire
и библиотека для счетчика:
DS2423.js/* Module for the DS2423 dual channel counter -----
Не тестировал - не на чем, отпишитесь о результатах.
Пытаюсь запустить Ваш скетч (z слабо в этом понимаю, делаю только с готовыми примерами),
и какую все таки библиотеку использовать???
может эту: https://github.com/honechko/DS2423
планирую подключить к Home assistant (тоже начинающий), как понимаю, чо нужно будет
поставить в HA 1-wire add-on, но он просит или подключения к серверу или к железяке 1-wire (видимо USB).
Хотелось бы сделать на ESP8266 (есть разные в наличии ESP 01, Wemos D1 mini pro, ESP32 и другие).
Получилось по быстрому сделать прошивку через https://wifi-iot.com/p/esp8266/
используя набор:
1-wire DS18B20 и GPIO
в вэбморде показало наличие 1-wire датчика его идентификатор.
Скетч (Ваш из примера):
#include <DS2423.h>
#include <OneWire.h>
OneWire ow(4); // DQ на пине 10, также необходим резистор 1кОм между DQ и VCC
DS2423 cnt(&ow);
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte addr[8];
unsigned long a, b;
if (!ow.search(addr)) {
Serial.println("No more addresses.");
ow.reset_search();
delay(5000);
return;
}
Serial.print("ROM =");
for (i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
Serial.println();
if (addr[0] == 0x1d &&
cnt.counter(addr, 0, &a) && cnt.counter(addr, 1, &b)) {
Serial.print(" Counter.A = ");
Serial.println(a);
Serial.print(" Counter.B = ");
Serial.println(b);
}
}
В скетче при компиляции выдает кучу ошибок начиная с кодом библиотеки, который Вы запостили.
Помогите пожалуйста.
Неактивний
Пример скетча на сайте и библиотека на гитхабе написаны на C++ для среды разработки ардуино.
Реализацию 1-wire для ESP8266 поиском в гугле я нашел на сайте https://www.espruino.com/OneWire, библиотеки под него написаны на js, именно на нем я написал реализацию работы со счетчиком, которую выложил здесь.
Код, естественно, нужно компилировать компилятором того языка, для которого он написан.
Давайте, чтобы я не гадал, скидывайте сюда ссылку на библиотеку OneWire (или на библиотеку для DS18B20), которая есть именно для Вашей среды разработки/компилятора, а я буду выкладывать для нее библиотеку работы со счетчиком.
Неактивний
Пример скетча на сайте и библиотека на гитхабе написаны на C++ для среды разработки ардуино.
Реализацию 1-wire для ESP8266 поиском в гугле я нашел на сайте https://www.espruino.com/OneWire, библиотеки под него написаны на js, именно на нем я написал реализацию работы со счетчиком, которую выложил здесь.
Код, естественно, нужно компилировать компилятором того языка, для которого он написан.
Давайте, чтобы я не гадал, скидывайте сюда ссылку на библиотеку OneWire (или на библиотеку для DS18B20), которая есть именно для Вашей среды разработки/компилятора, а я буду выкладывать для нее библиотеку работы со счетчиком.
Прошиваю через Arduino IDE
в Ваше скетче изменил:
uint32_t a, b; (было unsigned long)
if (cnt.counter(addr, 0, &a) && cnt.counter(addr, 1, &b))
ошибки ушли.
Библиотеку OneWire подключил через менеджер библиотек - https://github.com/PaulStoffregen/OneWire
То что я писал выше, с помощью wi-fi.iot по шине 1-wire определилось с таким номером:
0x1d, 0x71, 0x42, 0x0f, 0x48, 0x4e, 0x59, 0x88
как понял 0x1d - это DS2423 (0x1D) 4kbit RAM with Counter (здесь нашел https://github.com/orgua/OneWireHub)
К wemos D1 mini подключено к D4 (GPIO2)
Т.е. приведенный текст библиотеки не подходит в Arduino ISE.
Я поставил ту на которую дали ссылку: https://github.com/honechko/DS2423/. (я так понял это Ваш гитхаб)
В ком порт выдает: No more addresses.
Остання редакція Kirill2022 (2022-02-02 17:23:16)
Неактивний
Моеже на ту же шину прицепить еще какое-то устройство, тот же DS18B20 ?
В общем разобралсы получилось.
Во вложении архив с 2-мя наборами включая библиотеки, все рабочее, прописан везде (где явно указан адрес моего DS2423 счетчика) и пин 2 для Wemos D1 mini pro (D4 - GPIO2)DS2423_arduino.zip
Пока не могу поймать (на настольной лампе увеличение импульсов, сейчас подключу к счетчику и посмотрю на COM
Неактивний
Пока не могу поймать (на настольной лампе увеличение импульсов, сейчас подключу к счетчику и посмотрю на COM
По-умолчанию счетные входы работают в "логическом" режиме, если подключаете аналоговый датчик, например фототранзистор, нужно установить threshold-ы.
Подробнее описано в статье
https://habr.com/ru/post/568314/
Неактивний
Kirill2022 пише:Пока не могу поймать (на настольной лампе увеличение импульсов, сейчас подключу к счетчику и посмотрю на COM
По-умолчанию счетные входы работают в "логическом" режиме, если подключаете аналоговый датчик, например фототранзистор, нужно установить threshold-ы.
Подробнее описано в статье
https://habr.com/ru/post/568314/
Я не понимаю как это сделать.
В код добавить можно?
Во допустим рабочий код:
#include <DS2423_ho.h>
OneWire ow(2); // DQ on pin 10, You also need 1k resistor between DQ and VCC
DS2423 cnt(&ow);
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte addr[8];
uint32_t a, b;
if (!ow.search(addr)) {
Serial.println("No more addresses.");
ow.reset_search();
delay(5000);
return;
}
Serial.print("ROM =");
for (i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
Serial.println();
if (addr[0] == 0x1d &&
cnt.counter(addr, 0, &a) && cnt.counter(addr, 1, &b)) {
Serial.print(" Counter.A = ");
Serial.println(a);
Serial.print(" Counter.B = ");
Serial.println(b);
}
}
который я сейчас заюзал.
После прикрепления к счетчику на мониторе компорта вижу очень маленькие прибавления к счетчику.
Практически совсем не считает.
И для начала, как убрать все лишнее из кода (оставить только необходимый минимум) и оставить только вывод А (это я пробовал, убрал В и НЕХ, только не могу удалить поиск еще адресов счетчика, если удаляю, то ничего не выводится).
А еще лучше оформить в виде функции которая отдает значение счетчика
Неактивний
И еще, я пробовал использовать другой проект для подсчета электроэнергии с TEMT6000 подключенному по аналоговому входу в ESP и передача данных через MQTT(прикрепил во вложении архив в вордовский файлом), так как там описание и код (с сайта удалилась публикация sprut.ai), но там что-то не так, не создается топик config и ничего не работает, да и с автоматизацией подсчета расхода ЭЭ для HA до конца не понятно.
И еще у меня счетчик делает импульсов: 6400 кВт/час.
Неактивний
Без опроса, по явно заданному адресу счетчика:
#include <DS2423.h>
OneWire ow(2);
DS2423 cnt(&ow);
byte addr[8] = {0x1d, 0x71, 0x42, 0x0f, 0x48, 0x4e, 0x59, 0x88};
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
uint32_t a, b;
if (cnt.counter(addr, 0, &a)) {
Serial.print(" Counter.A = ");
Serial.println(a);
}
if (cnt.counter(addr, 1, &b)) {
Serial.print(" Counter.B = ");
Serial.println(b);
}
delay(1000);
}
Изменять настройки счетчика из ардуино можно, есть небольшой пример в examples/DS2423_Counter.ino
// example how to change sampling interval to 19ms
cnt.write(addr, buf, (word)32 * 8 + 13, 1); // page 8, offset 13
Описание памяти здесь
Но это сложный путь) лучше под линуксом поднимите owhttpd и через веб-страничку
Неактивний
Без опроса, по явно заданному адресу счетчика:
Изменять настройки счетчика из ардуино можно, есть небольшой пример в examples/DS2423_Counter.ino
// example how to change sampling interval to 19ms cnt.write(addr, buf, (word)32 * 8 + 13, 1); // page 8, offset 13
Описание памяти здесь
Но это сложный путь) лучше под линуксом поднимите owhttpd и через веб-страничку
Спасибо, я попробую на ноуте поднять owhttpd, я так понимаю к нему же и подключить ESP, а при подключении писать localhost? И какой порт - стандартный?
И какие настройки тим нужно будет выставить для моего счетчика? Как их узнать?
Неактивний
После прикрепления к счетчику на мониторе компорта вижу очень маленькие прибавления к счетчику.
Практически совсем не считает.
Если Вы счетный вход будете соединять с землей (кнопкой, герконом), то будет считать все без потерь, т.к. сопротивление меняется между 0 и бесконечность. Если Вы подключаете фототранзистор и меняете освещенность от полной темноты до прямого света на фототранзистор, то также будет считать все импульсы без потерь.
Но при среднем освещении и небольшом изменении яркости счетный вход (который находится в логическом режиме) только при каком-то одному ему известном значении освещенности будет менять состояние между high/low, что приведет к прибавлению импульса. Чтобы точно задать этот уровень освещенности нужно перевести счетный вход в аналоговый режим и установить пороговое значение аналогового сигнала, при переходе через которое счетчик будет понимать, что поменялась освещенность и нужно прибавить импульс.
Неактивний
а при подключении писать localhost? И какой порт - стандартный?
И какие настройки тим нужно будет выставить для моего счетчика? Как их узнать?
IP тот, на котором запущен owhttpd, port по умолчанию 2121 (задается в конфиге ohttpd)
Настройки очень индивидуальны) с "заводскими" настройками счетчик считает импульсы с геркона, несколько других случаев (фототранзистор, инфракрасный отражатель, датчик Холла) и объяснений по настройкам есть в статье.
Неактивний
Но при среднем освещении и небольшом изменении яркости счетный вход (который находится в логическом режиме) только при каком-то одному ему известном значении освещенности будет менять состояние между high/low, что приведет к прибавлению импульса. Чтобы точно задать этот уровень освещенности нужно перевести счетный вход в аналоговый режим и установить пороговое значение аналогового сигнала, при переходе через которое счетчик будет понимать, что поменялась освещенность и нужно прибавить импульс.
- нужно перевести счетный вход в аналоговый режим - это как?
В общем совсем не понятно, как реально настроить на эл.счетчик с 6400 испульсами на кВт/час
Неактивний