Моргаем светодиодами без "задержки".Индикация состояния "прибора"

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

Привет всем!

места для нормального TFT индикатора нет, хочется поставить два светодиода для индикации режима работы.  В общей сложности нужно отразить 16 состояний, частино взаимоисключающих. Индикация нужна только в момент нажатия кнопок. 90% времени устройство просто лежит и не требует переключения. т.е. 1 мырг в 10 сек будет достаточен, что бы убедиться, что акку еще заряжен.

Меню 1 - мигаем красным 1 раз в секунду,  Меню 2, мигаем 2 раза в секунду.

Режим 1 - мигаем зеленым 1 раз, Режим 2 - мигаем 2 раза зеленым и тп.

Есть еще какие- либо альтернативы? Какую скважность выбрать? Хватит 1/10 секунды?

Каким образом наименее затратно, с точки зрения загрузки loop() выполнить моргание? У меня там Bluetooth опрашивается и  хочется батарейку экономить... 

 

p.s. в перспективе переход на ATtiny 85 или ATtiny841, при тактовой частоте 1 Mhz . (1-2mA)

 

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Думаете с точки зрения пользователя подсчет мигов будет кошерно, особенно 16штук. У меня на одной сигналке так было, выбешивало страшно. Семисегментник по крайней мере узнаваемые символы будет выводить. ИМХО.

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

bwn пишет:

Думаете с точки зрения пользователя подсчет мигов будет кошерно, особенно 16штук. У меня на одной сигналке так было, выбешивало страшно. Семисегментник по крайней мере узнаваемые символы будет выводить. ИМХО.

Это понятно. У меня проблема с потреблением энергии. Делаю маленькое устройство, которое питается от 1 аккумулятора. Реально там 2 режима +2 Тестовых / + Регулируется частота (2 светодиод).  Оно подключено по Bluetooth к телефону. Вернее сказать включается, конфигурируется  и лежит так часов 8... 

Телефон посылает в сериальый порт Команды, и нужена минимальная обратная связть, что команда дошла.

Если поставить туда Индикатор от Nokiа 5110, то подсветка сразу жрет много электрическва. Кроме того места  в корпусе мало. Если ты посоветуешь жидкокристаллический индикатор, который позволяет вывести 5-6 символов и потребляет менее 2-3ма, работая без подсветки, то будет здорово...

 

bwn
Offline
Зарегистрирован: 25.08.2014

Глянь, такого типа. Сам не юзал, поэтому без комментариев.
И управление там вроде какое то хитрое.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

achest, незнаю как модулю 5510, а родному дисплею от 3310 подсветка не нужна, собссно на самом дисплее её и нету физически. Ему вообще питание не нужно, он  способен  "кушать с шины"  какие-то крохи. Однажды попытался  измерить ток его потребления, отсоединил питание -а он работает.  Я его приклеиваю прямо на корпус устройства:

А есть сверх экономные ЖК дисплеи от телефонов , могут по нескольку лет работать от одной пальчиковой батарейки. Потребляют всего 10мкА при питании 1...1,5 вольта. У меня один такой есть, может отображать цифры и всякие уголочки.  Называется AL-801LCD как бонус в нём часы.  . Правда по габаритам они гораздо больше чем 3310.

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

achest, незнаю как модулю 5510, а родному дисплею от 3310 подсветка не нужна, собссно на самом дисплее её и нету физически.

Привет!

Спасибо за совет. К сожалению такой элементной базы в местном магазине по приемлемым ценам нет.   http://www.reichelt.de/

Один там я уже купил ( для http://www.mikrocontroller.net/articles/AVR_Transistortester) ,  без подсветки не возможно пользоваться. пришлось покупать подсветку и фрезировать корпус. Автор явно ни разу не собирал его сам - не хватает 0.5мм...

Самому травить плату и тп не хочется. Проще найти готовый. 

Я специально написал это в форуме программирование. Потому, что я ищу простое, программное готовое решение. Для хардварного решения я бы открыл тему в другом форуме..

 

Так как ответом по делу нет, придется писать самому, на базе Библиотеки Timer1.  По крайней мере нормальной библиотеки RTOS я так и не нашел, а переходить ради этого на STM32 пока еще слижком сложно... Выставлю таймер раз в 20..50 мс и буду надеяться, что Bluetooth еще будет нормально работать...

 

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

а в чем проблема считать в двух переменных состояние миллис? Зачем какая-то библиотека?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

achest, у вас в германии нет ebay и ali ? зачем же ограничивать себя возможностями местного магазина..

Вобще задача мигать раз в .. миллисекунд очень проста,  я бы не стал совать это в loop. Гораздо удобнее сделать на любом таймере, можно и на вотчдоге мигать, если более серьёзные таймеры нужны для более важных дел. Вот например:

int mydelay = 187; // пауза между миганиями 1 попугай = 16мс , 187 -3 секунды
void setup(){
pinMode (13,OUTPUT);
WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=(1<<WDIE); // разрешение прерывания + выдержка 16ms (55 страница даташита)
}

void loop() { }
  
ISR (WDT_vect){
static byte n=0; 
if (n==0) PORTB|= 1<<5; // при ноле зажечь лед
if (n==1) PORTB&=~(1<<5); //при единице погасить
n==mydelay? n=0 : n++ ; // если досчитали до.. то сбрость счётчик
}

Изменяя переменную mydelay можно задавать интервалы между миганиями. 

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

JollyBiber пишет:

а в чем проблема считать в двух переменных состояние миллис? Зачем какая-то библиотека?

Все правильно. Технической проблемы нет. У меня просто еще 2 мотора, которыми  можно так же  управлять. Т.е. получается минимум 6 глобальных переменных: 4 "состояние"  + 6 сколько мыргов еще осталось. В перспективе может еще 1 добавиться... Так как я пришел из Ява/C++ то хочется, красиво, по принципу "1 функция - 1 действие."

Думал, может у кого есть подобная библиотека, задача то стандартная...

Пойду писать библиотеку, что бы данные из таймера использовать... Загоню все массив и при желании расширю уже его.

Спасибо dimax  за код.