Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Для начала стоит задуматься над тем сколько нужно TCP пакетов для передачи единственного int32 значения.
что такое powerdown контроллеров Atmel и что такое WakeUp через reset, вопросы «пропадания» питания отпадут сами-собой. В таком режиме контроллер будет работать от батарейки месяцами!
для Ардуино надо back up питание прикрутить от батарейки
Автор не заморачивается прерываниями и спящим режимом — delay и поскакали дальше.
А ничего что автор по http текстовку в «sendHTTPRequest(); » гоняет, байтом больше\меньше…
rclient.println(request);
rclient.print(«Host: „);
rclient.println(server);
rclient.println(“Authorization: Basic UmI9dlPnaJI2S0f=»); // Base64 строка, полученная со значения «user:password»
rclient.println(«User-Agent: Arduino Sketch/1.0»);
rclient.println();
rclient.stop();
void loop() {
delay(1000); // Задержка в 1 сек, пусть будет :)
// Проверяем состояние всех счетчиков
for (int i=0; i<6; i++) {
boolean changed = CounterBouncer[i].update();
…
}
Или есть причины, которых мы не знаем, по которым счетчик не может сработать более 2 раз в секунду (неплохо бы написать в статье в таком случае)
прерывания очень чувствительны к дребезгу в отличие от существующего вашего кода. Так одно срабатывание геркона может дать десяток импульсов
Алгоритм прерывания с антидребезгом будет выглядеть так:
Зашли в обработчик INT0
0 или +1
Запретили локально INT0
Поставили на таймер событие разрешающее INT0 через несколько миллисекунд
Вышли из обработчика
Если же просто опрашивать кнопки со строго заданным интервалом
делаем XOR с предыдущим значением и у нас есть вся необходимая информация для решения — какой датчик изменил своё состояние и в какую сторону.
for (int i=0; i<6; i++) {
boolean changed = CounterBouncer[i].update();
if ( changed ) {
int value = CounterBouncer[i].read();
// Если значение датчика стало ЗАМКНУТО
if ( value == LOW) {
//Serial.println(CounterPin[i]);
sprintf(request, "GET /input.pl?object=%s HTTP/1.0", CounterName[i]); // Формируем ссылку запроса, куда вставляем имя счетчика
sendHTTPRequest(); // Отправляем HTTP запрос
}
}
}нет, ну чем хуже просто считать все входы разом и потом их обрабатывать побитно, через сдвиг в цикле? Если вдруг состояние изменится после считывания — обработано будет в следующей итерации.
Резистор 250 Ом имитирует входное сопротивление порта меги (5В; 20мА)
Экспериментальным путем было определено, что счетчики работают не просто, а очень просто. Когда последний разряд меняет свое значение с 9 на 0, замыкается геркон внутри счетчика. В таком состоянии он находится до того, пока значение последнего разряда не станет равным 3.
на один оборот младшего разряда срабатывание все равно один раз.


Я провел масштабное исследование, собрал статистику за 3 года и выяснил что отклонения от месяца к месяцу настолько незначительные, что в УК можно отправлять средние показания, разв полгода корректировать отклонения и всё)))
Автоматизация снятия показаний со счетчиков воды