Режим сна
- Войдите на сайт для отправки комментариев
Добрый день, проблема такая: хочу сделать копилку со счетчиком монет(не как у Гайвера) и режимом сна. Монетка пролетает между светодиодом и фоторезистором, сигнал меняется с низкого на высокий, происходит прерывание, изменение флажка и выполнение void loop. Проблема заключается в том, что я не знаю как реализовать корректную работу с погасанием дисплея. К примеру: при отсутствии активности на протяжении 10 секунд дисплей должен погаснуть(и желательно ардуина должна уснуть, останется только гореть светодиод), но как это реализовать если пролетает несколько монет, и после последней должно пройти 10 секунд. Код прикрепляю (не знаю как вы красиво вставляете, поэтому просто вот так: #include "LiquidCrystalRus.h" LiquidCrystalRus lcd(12, 11, 7, 6, 5, 4); int money; volatile boolean flag; void fucking() { flag = 1; } void setup() { lcd.begin(16, 2); pinMode(13, OUTPUT); digitalWrite(13, 1); pinMode(2, INPUT_PULLUP); attachInterrupt(0, fucking, RISING); } void loop() { if (flag == 1) { money = money + 10; lcd.setCursor(10, 0); lcd.print("РУБ"); lcd.setCursor(0, 1); lcd.print("ТУТ ТЕКСТ"); lcd.setCursor(4, 0); lcd.print(money); flag = !flag; } } Я хотел это реализовать так: при срабатывании прерывания void loop не продолжается с момента остановки, а начинается сначала, но такого способа я не нашел, а goto из одной функции в другую отправить не может. Подскажите пожалуйста как это реализовать. Про спящий режим не нашел подробной информации и РЕАЛЬНЫХ полезных примеров. Пытался выяснить как это работает в коде Гайвера в проектах копилка со счетчиком монет и хронографе, но у него очень громоздкий и тяжелый код, так что я ничего из него не понял. Про то, что при глубоком сне нужно использовать EEPROM память я знаю, реализую это после режима сна. Подскажите что делать.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
НуНу. Ожидающий монетку светодиод съест батарейку за сутки. Никакой режим сна процессора не поможет. Даже если раз в миллисекунд в 100 просыпаться и проверять наличие монетки то батарейки на долго не хватит. Смысл?
Ну можно и без энергосбережения обойтись
А можете еще подсказать как код красиво вставить.
Я пытался, не получилось. Еще и абзацы все пропели в тексте
А про батарейку еще:
Можно ведь на светодиод ШИМ подавать, я пробовал, все работает при напряжении 0,2В (analogWrite(10))
Смог нормально прикрепить код: #include "LiquidCrystalRus.h" LiquidCrystalRus lcd(12, 11, 7, 6, 5, 4); int money; volatile boolean flag; void fucking() { flag = 1; } void setup() { lcd.begin(16, 2); pinMode(13, OUTPUT); digitalWrite(13, 1); pinMode(2, INPUT_PULLUP); attachInterrupt(0, fucking, RISING); } void loop() { if (flag == 1) { money = money + 10; lcd.setCursor(10, 0); lcd.print("РУБ"); lcd.setCursor(0, 1); lcd.print("ТУТ ТЕКСТ"); lcd.setCursor(4, 0); lcd.print(money); flag = !flag; } }Спасибо
Нужно определение именно монетки или любого предмета?
Монетки
Тогда вам нужен Coin Acceptor. Между светодиодом и фотодиодом можно сунуть что угодно и это будет "монетка".
Дак со считыванием монеты(или любого другого предмета) я разобрался.
У меня вопрос в том, как реализовать затухание дисплея, если монеты не пролетали 10 секунд
Ну, наверное, засечь время от последнего броска - нет?
То есть при аппаратном прерывании узнавать с через millis сколько сейчас времени, а потом в loop вычитать?
Типа того.
Спасибо
Утром попробую
Попробовал, не до конца понимаю как это сделать.
В функции прерывания записываю в переменную сколько сейчас время, затем в loop сравниваю так, что бы к примеру время сейчас было на 3 секунды больше чем во время прерывания. Даже не знаю как это объяснить, но как при сравнении узнавать сколько сейчас время.
#include "LiquidCrystalRus.h" LiquidCrystalRus lcd(12, 11, 7, 6, 5, 4); int money; volatile boolean flag; volatile unsigned long seconds; unsigned long seconds1; void fucking() { seconds = millis(); flag = 1; } void setup() { Serial.begin(9600); lcd.begin(16, 2); pinMode(13, OUTPUT); digitalWrite(13, 1); pinMode(2, INPUT_PULLUP); attachInterrupt(0, fucking, RISING); } void loop() { if (flag == 1) { money = money + 10; Serial.println(money); lcd.setCursor(10, 0); lcd.print("РУБ"); lcd.setCursor(0, 1); lcd.print("ТУТ ТЕКСТ"); lcd.setCursor(4, 0); lcd.print(money); flag = !flag; delay(3000); if (seconds1 = millis() > seconds + 3000) { Serial.println("I'm sleep"); } } }То есть вопрос в том, как реализовать последнии строки
Ну и сделать это без delay как сейчас, ибо после считывания с фоторезистора проходит 3 секунды, и только потом выводится сумма монет
С этим delay 3000 не только задержка в работе получается, но и сумма монет не успевает складываться, к примеру аппаратное прерывание сработало 10 раз, а сумма увеличилась на 30(тогда как она должна была увеличиться на 100)
Вместо Serialprint потом будет либо nobacklight либо отключение питания дисплея через транзистор
То есть вопрос в том, как реализовать последнии строки
Надо вынести проверку времени из условия проверки флага в отдельное условие. Иначе без delay оно никогда не наступит.
Т.е. вы в цикле должны проверять два независимых условия
- есть ли новые монеты?
- прошло ли три секунды?
И прочитайте самое начало http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis