Режим сна

Zea
Offline
Зарегистрирован: 18.04.2020

Добрый день, проблема такая: хочу сделать копилку со счетчиком монет(не как у Гайвера) и режимом сна. Монетка пролетает между светодиодом и фоторезистором, сигнал меняется с низкого на высокий, происходит прерывание, изменение флажка и выполнение 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 память я знаю, реализую это после режима сна. Подскажите что делать.

sadman41
Offline
Зарегистрирован: 19.10.2016
nik182
Offline
Зарегистрирован: 04.05.2015

НуНу. Ожидающий монетку светодиод съест батарейку за сутки. Никакой режим сна процессора не поможет. Даже если раз в миллисекунд в 100 просыпаться и проверять наличие монетки то батарейки на долго не хватит. Смысл?  

Zea
Offline
Зарегистрирован: 18.04.2020

Ну можно и без энергосбережения обойтись

Zea
Offline
Зарегистрирован: 18.04.2020

А можете еще подсказать как код красиво вставить.

Я пытался, не получилось. Еще и абзацы все пропели в тексте

 

Zea
Offline
Зарегистрирован: 18.04.2020

А про батарейку еще:

Можно ведь на светодиод ШИМ подавать, я пробовал, все работает при напряжении 0,2В (analogWrite(10))

 

Zea
Offline
Зарегистрирован: 18.04.2020
Смог нормально прикрепить код:
#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;

  }
}

 

Zea
Offline
Зарегистрирован: 18.04.2020

Спасибо

sadman41
Offline
Зарегистрирован: 19.10.2016

Нужно определение именно монетки или любого предмета?

Zea
Offline
Зарегистрирован: 18.04.2020

Монетки

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда вам нужен Coin Acceptor. Между светодиодом и фотодиодом можно сунуть что угодно и это будет "монетка".

Zea
Offline
Зарегистрирован: 18.04.2020

Дак со считыванием монеты(или любого другого предмета) я разобрался.

У меня вопрос в том, как реализовать затухание дисплея, если монеты не пролетали 10 секунд

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, наверное, засечь время от последнего броска - нет?

Zea
Offline
Зарегистрирован: 18.04.2020

То есть при аппаратном прерывании узнавать с через millis сколько сейчас времени, а потом в loop вычитать?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Типа того.

Zea
Offline
Зарегистрирован: 18.04.2020

Спасибо

Утром попробую

Zea
Offline
Зарегистрирован: 18.04.2020

Попробовал, не до конца понимаю как это сделать.

В функции прерывания записываю в переменную сколько сейчас время, затем в 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");
    }
  }
}

То есть вопрос в том, как реализовать последнии строки

Zea
Offline
Зарегистрирован: 18.04.2020

Ну и сделать это без delay как сейчас, ибо после считывания с фоторезистора проходит 3 секунды, и только потом выводится сумма монет

Zea
Offline
Зарегистрирован: 18.04.2020

С этим delay 3000 не только задержка в работе получается, но и сумма монет не успевает складываться, к примеру аппаратное прерывание сработало 10 раз, а сумма увеличилась на 30(тогда как она должна была увеличиться на 100)

Zea
Offline
Зарегистрирован: 18.04.2020

Вместо Serialprint потом будет либо nobacklight либо отключение питания дисплея через транзистор

 

 

 

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Zea пишет:

То есть вопрос в том, как реализовать последнии строки

Надо вынести проверку времени из условия проверки флага в отдельное условие. Иначе без delay оно никогда не наступит.

Т.е. вы в цикле должны проверять два независимых условия

- есть ли новые монеты?

- прошло ли три секунды?

И прочитайте самое начало http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis