то что сбросить бит прерывания я вот что-то и не подумал, хотя как сделать это на arduino C не знаю, видел как сделать такое на асме.
Но схема с таймером мне нравится больше.
Даже предложенный Вами вариант с перезапуском таймера в принципе будет довольно интересным решением. Надо теперь воплотить в макете и проверить работу.
Я имел ввиду что не надо отключать прерывания в функции обработчике прерываний.
А так да, при дребезге контактов даже с задержкой 1 секунда мы получим зачастую две операции ингредиента.
После того как придет первый сигнал на обработку, будет снят бит прерывания, и функция будет делать то что ей сказали, а именно ждать. Но в это время произойдет спад сигнала и снова подъем, естественно это выставит бит прерывания опять. Все последующие изменения сигнала просто не будут обработаны.
После того как завершится функция обработки прерывания, МК увидит что стоит опять бит прерывания и запустит данную функцию еще раз.
более правильным выходом наверное будет все таки не по прерыванию считать, а в основном цикле программы, но тогда время работы от батареи будет намного меньше.
Наверное выход в обработчике прерываний конфигурировать прерывание по таймеру и уже в обработчике прерывания по таймеру делать операцию ингредиента и вгонять МК в сон.
Хотя все конечно надо проверять и тестировать.
Не делайте так никогда.
Я по незнанию так написал.
Контроллеры AVR на время обработки прерывания сами блокируют выполнение других прерываний. Так что в принципе кода
Вот тут-то и кроется сам подвох.
Для данной задачи в принципе достаточно даже решения через каждые 50мс проверять состояние ноги.
На прерывании тоже достаточно отключить при вхождении в обработчик прерывания обработку прерывания (масло масляное). Сделать задержку в 50мс и после чего инкрементировать переменную с последующим включением обработчика прерываний.
Что-то вроде того.
Но вот что делать когда у меня два таких прерывания могут быть? И мало того, вся схема питается от батареи, и желательно на время ожидания уводить ее в глубокий сон. Ставить микросхему триггера — понижать время жизни от батареи.
Есть два вида подключения кнопок к микроконтроллерам.
Первый это так как указано на схеме.
Второй это как раз подача низкого сигнала на ногу, вот тогда и надо переводить ножку в состояние PULLUP.
Посмотрите документацию на ардуино, там указано.
Не всегда хватает встроенного резистора.
Буквально в субботу делал уроки по обучению для ардуино. Сделал примерно аналогичную макетку. При нажатии на кнопку по прерыванию на спад увеличивалось значение переменной. И вот там столкнулся с одной большой проблемой называемой дребезг контактов. То есть на одно нажатие могло быть до 10 операций инкремента.
Вопрос, как в данном решении решен данный момент?
не для всех проектов оно нужно.
но вот для считывания показаний со счетчиков оно просто необходимо. Не каждый захочет тянуть провода в отремонтированной квартире. Это же касается и передачи данных.
Я вообще сначала рассматривал связку attiny13a + передатчик на 433 MHz, но как понял что надо разработать протокол передачи устойчивым к помехам, плюс уместить это дело в 1КБ понял что слишком затратно.
Ну у меня идея немного другая.
Сам модуль nrf24le01 содержит в себе еще и микроконтроллер довольно таки мощный. То есть его хватит и для большего.
При поступлении сигнала он счетчика его надо просто обработать, сформировать пакет для отсылки и отправить уже на сервер. Сервер принимает сообщение и уже там считает и ведет статистику.
Работать сам датчик должен от батареек, и работать должен довольно долго. Поэтому и встает вопрос перевода модуля в режим глубокого сна. А с учетом что зачастую счетчики воды рассчитаны на пропускание максимум 10л/с то получается что контроллер от одного счетчика будет просыпаться максимум 1 раз в секунду, от двух конечно может по чаще. Но это крайний режим работы, можно сказать это самый ресурсоемкий режим, так что зачастую модуль будет спать.
Сейчас планирую нечто похожее делать на даче.
Смотрю на такие краны и понимаю что при количестве 4 штук получается уже не кислая стоимость. Еще надо кучу датчиков и сервер с ибо. Удовольствие не дешевое.
У самого еще в планах сделать снятие показаний с счетчиков воды, но правда я рассматривал вариант использования модулей NRF24LE01 по причине меньшего потребления энергии. Но тк я только начинающий то есть куча вопросов, начиная от количества аппаратных внешних прерываний в этом модуле и временем выхода из глубокого сна.
Было бы вообще интересно узнать как обстоят дела с авариями на сети.
Уже больше года мучаемся с ЦОД на остаповском. Туда прокинут VPN ipsec L2L, все вроде хорошо, кроме одного, периодически обрываются все tcp соединения. Уже и заявки писали и звонили, ответ всегда один, У нас все в порядке.
Но вот после аварии 13.04.2015 на Остаповском неделю была сказка. Соединения не рвались, разработчики не ныли что sql отваливается и тп.
А сейчас опять та же картина.
При этом с нашей стороны на оборудовании уже месяца три ничего не менялось.
При выборе стоит обратить на это внимание.
Сегодня столкнулся с тем что надо было используя zabbix_sender послать не только данные но и время в которое были данные получены. Скрипт обработчик был написан на perl, поэтому использовал функцию. Ну и как положено она не заработала после небольшого дополнения.
В итоге после прочтения документации www.zabbix.org/wiki/Docs/protocols/zabbix_sender/2.0
Функция приняла такой вид
sub zabbix_send{
my ($zabbixserver,$hostname,$item,$data, $timestamp) = @_;
my $timeout=10;
my $result;
my $request = '{"request":"sender data","data":[{"value":"' . $data . '","host":"' . $hostname . '","key":"' . $item . '"';
$request .= ',"clock":"' . $timestamp . '"' if defined $timestamp;
$request .= '}]}';
my $sock = new IO::Socket::INET ( PeerAddr => $zabbixserver, PeerPort => '10051', Proto => 'tcp', Timeout => $timeout);
die "Could not create socket: $!\n" unless $sock;
$sock->send($request);
my @handles=IO::Select->new($sock)->can_read($timeout);
if (scalar(@handles) > 0){
$sock->recv($result,1024);
}
$sock->close();
}
Вроде все нормально!
конечно у себя такое внедрять не буду, уж очень много данных и не все нужные.
Но хотел бы сделать пару замечаний.
1. писать скрипт не perl и потом из него дергать zabbix_sender, мне кажется не совсем правильным.
В свое время на просторах интернета нашел вот такое
sub zabbix_send{
my $zabbixserver = "";
my $hostname = "";
my $item = "";
my $data = "";
($zabbixserver,$hostname,$item,$data) = @_;
my $timeout=10;
my $result;
my $request=sprintf("<req>\n<host>%s</host>\n<key>%s</key>\n<data>%s</data>\n</req>\n",encode_base64($hostname),encode_base64($item),encode_base64($data));
my $sock = new IO::Socket::INET ( PeerAddr => $zabbixserver, PeerPort => '10051', Proto => 'tcp', Timeout => $timeout);
die "Could not create socket: $!\n" unless $sock;
$sock->send($request);
my @handles=IO::Select->new($sock)->can_read($timeout);
# print "item - $item, data - $data\n";
if (scalar(@handles) > 0)
{
$sock->recv($result,1024);
# print "answer from zabbix server $zabbixserver: $result\n";
}
# else
# {
# print "no answer from zabbix server\n";
# }
$sock->close();
}
2. Хочется все таки более гибкого скрипта. Что бы при новой инсталляции не лезть в нутрь и править параметры. в своих скриптах использовал такую конструкцию
my $_hostname;
my $zabbix_conf = "/etc/zabbix/zabbix_agentd.conf";
my $zabbixhostnameitem;
open my $FH, $zabbix_conf or die "Cannot open file $zabbix_conf ($!)";
while(<$FH>){
if(/^Hostname=(.*)$/){
$_hostname = $1;
}
if(/^HostnameItem=system.hostname$/){
$zabbixhostnameitem = hostname();
}
}
close $FH;
if(defined($zabbixhostnameitem) and !defined($_hostname)){
$_hostname = $zabbixhostnameitem;
}
Конечно это при условии что установлен zabbix_agent и настроен, конечно здесь только имя хоста определяется, но думаю мысль понятна.
Не читал всю статью, только по диагонали.
Еще на 2003 винде поднимал MSSQL active/passive с общим хранилищем, ничего сложного, все по докам.
Давно с видой не работаю и встала задача поднять MSSQL кластер не с общим хранилищем. Для мааааленькой БД подключения терминальных клиентов, потому что в 2012 для этого теперь просто необходим MSSQL. Вот здесь я получил затык. Не могу найти для чайников документации. А хочется. Хочется MSSQL для такой маленькой но очень важной задачи разнести на две отдельные виртуалки на двух разных серверах виртуализации. Естественно ни о каком общем СХД речи и не идет.
#!/bin/bash
ARRAY=(
one
two
three
four
)
s=""
echo -en "{\"data\": ["
for i in ${ARRAY[@]}; do
echo -en "$s"
s=","
echo -en "{\"{#QUEUENAME}\":\"$i\"}"
done
echo -en "]}"
Но схема с таймером мне нравится больше.
Даже предложенный Вами вариант с перезапуском таймера в принципе будет довольно интересным решением. Надо теперь воплотить в макете и проверить работу.
А так да, при дребезге контактов даже с задержкой 1 секунда мы получим зачастую две операции ингредиента.
После того как придет первый сигнал на обработку, будет снят бит прерывания, и функция будет делать то что ей сказали, а именно ждать. Но в это время произойдет спад сигнала и снова подъем, естественно это выставит бит прерывания опять. Все последующие изменения сигнала просто не будут обработаны.
После того как завершится функция обработки прерывания, МК увидит что стоит опять бит прерывания и запустит данную функцию еще раз.
более правильным выходом наверное будет все таки не по прерыванию считать, а в основном цикле программы, но тогда время работы от батареи будет намного меньше.
Наверное выход в обработчике прерываний конфигурировать прерывание по таймеру и уже в обработчике прерывания по таймеру делать операцию ингредиента и вгонять МК в сон.
Хотя все конечно надо проверять и тестировать.
Я по незнанию так написал.
Контроллеры AVR на время обработки прерывания сами блокируют выполнение других прерываний. Так что в принципе кода
Может быть вполне достаточно.
Для данной задачи в принципе достаточно даже решения через каждые 50мс проверять состояние ноги.
На прерывании тоже достаточно отключить при вхождении в обработчик прерывания обработку прерывания (масло масляное). Сделать задержку в 50мс и после чего инкрементировать переменную с последующим включением обработчика прерываний.
Что-то вроде того.
Но вот что делать когда у меня два таких прерывания могут быть? И мало того, вся схема питается от батареи, и желательно на время ожидания уводить ее в глубокий сон. Ставить микросхему триггера — понижать время жизни от батареи.
Первый это так как указано на схеме.
Второй это как раз подача низкого сигнала на ногу, вот тогда и надо переводить ножку в состояние PULLUP.
Посмотрите документацию на ардуино, там указано.
Не всегда хватает встроенного резистора.
Вопрос, как в данном решении решен данный момент?
но вот для считывания показаний со счетчиков оно просто необходимо. Не каждый захочет тянуть провода в отремонтированной квартире. Это же касается и передачи данных.
Я вообще сначала рассматривал связку attiny13a + передатчик на 433 MHz, но как понял что надо разработать протокол передачи устойчивым к помехам, плюс уместить это дело в 1КБ понял что слишком затратно.
Сам модуль nrf24le01 содержит в себе еще и микроконтроллер довольно таки мощный. То есть его хватит и для большего.
При поступлении сигнала он счетчика его надо просто обработать, сформировать пакет для отсылки и отправить уже на сервер. Сервер принимает сообщение и уже там считает и ведет статистику.
Работать сам датчик должен от батареек, и работать должен довольно долго. Поэтому и встает вопрос перевода модуля в режим глубокого сна. А с учетом что зачастую счетчики воды рассчитаны на пропускание максимум 10л/с то получается что контроллер от одного счетчика будет просыпаться максимум 1 раз в секунду, от двух конечно может по чаще. Но это крайний режим работы, можно сказать это самый ресурсоемкий режим, так что зачастую модуль будет спать.
Смотрю на такие краны и понимаю что при количестве 4 штук получается уже не кислая стоимость. Еще надо кучу датчиков и сервер с ибо. Удовольствие не дешевое.
У самого еще в планах сделать снятие показаний с счетчиков воды, но правда я рассматривал вариант использования модулей NRF24LE01 по причине меньшего потребления энергии. Но тк я только начинающий то есть куча вопросов, начиная от количества аппаратных внешних прерываний в этом модуле и временем выхода из глубокого сна.
Уже больше года мучаемся с ЦОД на остаповском. Туда прокинут VPN ipsec L2L, все вроде хорошо, кроме одного, периодически обрываются все tcp соединения. Уже и заявки писали и звонили, ответ всегда один, У нас все в порядке.
Но вот после аварии 13.04.2015 на Остаповском неделю была сказка. Соединения не рвались, разработчики не ныли что sql отваливается и тп.
А сейчас опять та же картина.
При этом с нашей стороны на оборудовании уже месяца три ничего не менялось.
При выборе стоит обратить на это внимание.
В итоге после прочтения документации www.zabbix.org/wiki/Docs/protocols/zabbix_sender/2.0
Функция приняла такой вид
конечно у себя такое внедрять не буду, уж очень много данных и не все нужные.
Но хотел бы сделать пару замечаний.
1. писать скрипт не perl и потом из него дергать zabbix_sender, мне кажется не совсем правильным.
В свое время на просторах интернета нашел вот такое
использовать как
2. Хочется все таки более гибкого скрипта. Что бы при новой инсталляции не лезть в нутрь и править параметры. в своих скриптах использовал такую конструкцию
Конечно это при условии что установлен zabbix_agent и настроен, конечно здесь только имя хоста определяется, но думаю мысль понятна.
Думаю переписать на нужный язык не составит труда. Ну или погуглить в нужном направлении.
Еще на 2003 винде поднимал MSSQL active/passive с общим хранилищем, ничего сложного, все по докам.
Давно с видой не работаю и встала задача поднять MSSQL кластер не с общим хранилищем. Для мааааленькой БД подключения терминальных клиентов, потому что в 2012 для этого теперь просто необходим MSSQL. Вот здесь я получил затык. Не могу найти для чайников документации. А хочется. Хочется MSSQL для такой маленькой но очень важной задачи разнести на две отдельные виртуалки на двух разных серверах виртуализации. Естественно ни о каком общем СХД речи и не идет.
Если есть опыт, поделитесь!!!
Не очень оптимальное но валидацию проходит
так это к автору статьи
я то просто работаю с заббиксом
могу предложить проверить вот таким скриптом
буквально сегодня таким методом много проверок заставил автоматом добавляться
Блин парсер схавал переводы строк