Фото-таймер

kinesis
Offline
Зарегистрирован: 26.09.2014

всем привет!

решил сделать себе фото-таймер, он нужен для включения фотоувеличителя на определенный промежуток времени. делаю на Atmega8, проверяю на Ардуино Леонардо. сразу скажу, что в программировании новичек!

сейчас работают кнопки вверх-вниз, изменяют выдержку по секунде от 10 и выше, и по 0.1 секунды при выдержках ниже 10с.

тут есть один непонятный момент! почему-то число 9.8 не отображается, вернее пропускается. т.е. можно выставить 9.7 или 9.9, но 9.8 просто проскакивает как вверх так и вниз -  не понимаю этого.

при нажатии кнопки "RUN" - включется нагрузка (сейчас это просто светодиод, будет реле) и идет отсчет до нуля.

необходимо сделать возможность паузы во время отсчета. т.е. во время отсчета, нажав кнокпу "run" нагрузка должна отключиться, отсчет приостановиться и при нажатии еще раз, продолжиться с места остановки. это основная проблема, я не понимаю как ее реализовать.

сперва я сделал все кнопки с библиотекой Bounce2, но как потом оказалось она не поддерживает долгое нажатие кнопки необходимого мне для задания времени. в итоге переделал, найдя пример в сети, теперь кнопки вверх-вниз работают так как я хотел.

кнопка "focus" пока не подключена, она должна просто включать нагрузку без отсчета времени, при повтторном нажатии отключать ее. но это потом.

основная задача сделать паузу во время отсчета.

прошу помощи у более опытных! нужны советя и примеры.

спасибо!

схема простая:

вот скетч на текущий момент:

#include <SevSeg.h>

SevSeg disp;

float count = 10;

#define led 12

#define BUTTON_UP 8
#define BUTTON_DOWN 9
#define BUTTON_RUN 11

#define debounce 10
#define holdTime 500

int UpLast, DownLast, RunLast = 0;
long btnDnTime, btnUpTime;
boolean ignoreUp = false;

void setup() {
  disp.Begin(0,A0,A1,A2,A3,PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7);
  disp.Brightness(5);
  
  digitalWrite(BUTTON_UP, HIGH);
  digitalWrite(BUTTON_DOWN, HIGH);
  digitalWrite(BUTTON_RUN, HIGH);
  pinMode(led, OUTPUT);
}

void buttonUp() {
  int butVal = digitalRead(BUTTON_UP);
  if (butVal == LOW && UpLast == HIGH && (millis() - btnUpTime) > long(debounce)) btnDnTime = millis();
  if (butVal == HIGH && UpLast == LOW && (millis() - btnDnTime) > long(debounce)) {
    if (ignoreUp == false) {
      if (count < 10) {
        count = count + 0.1;
      } else count++;
    } else ignoreUp = false;
    btnUpTime = millis();
  }
  if (butVal == LOW && (millis() - btnDnTime) > long(holdTime)) {
    if (count < 10) {
      count = count + 0.1;
    } else count++;
    ignoreUp = true;
    btnDnTime = millis();
  }
  UpLast = butVal;
}

void buttonDown() {
  int butVal = digitalRead(BUTTON_DOWN);
  if (butVal == LOW && DownLast == HIGH && (millis() - btnUpTime) > long(debounce)) btnDnTime = millis();
  if (butVal == HIGH && DownLast == LOW && (millis() - btnDnTime) > long(debounce)) {
    if (ignoreUp == false) {
      if (count <= 10) {
        count = count - 0.1;
      } else count--;
    } else ignoreUp = false;
    btnUpTime = millis();
  }
  if (butVal == LOW && (millis() - btnDnTime) > long(holdTime)) {
    if (count <= 10) {
      count = count - 0.1;
    } else count--;
    ignoreUp = true;
    btnDnTime = millis();
  }
  DownLast = butVal;
}

void countDown(float countStart){
  for(countStart; countStart > 10; countStart--){
    digitalWrite(led, HIGH);
    long time = millis();
    while(millis() < time+1000) {
      disp.PrintOutput();
      disp.NewNum(countStart,(byte) 0); 
    }
  }
  for(countStart; countStart > 0; countStart=countStart-0.1){
    long time = millis();
    while(millis() < time+100) {
      disp.PrintOutput();
      disp.NewNum(countStart*10,(byte) 1);
    }
  }
  digitalWrite(led, LOW);
}

void loop() {
  
  buttonUp();
  buttonDown();
  
  int butVal = digitalRead(BUTTON_RUN);
  if (butVal == LOW && RunLast == HIGH && (millis() - btnUpTime) > long(debounce)) countDown(count);
  RunLast = butVal;
  
  disp.PrintOutput();
  if (count < 10) {
    disp.NewNum(count*10,(byte) 1);
  } else   disp.NewNum(count,(byte) 0);
  
}

 

art100
Offline
Зарегистрирован: 09.03.2014

Тоже интересно.

Светодатчиком светодиод в обратном включении?

А марку помнишь?

Может встречал свето-вольтовую характеристику какую-нибудь?

Алгоритм как я понимаю для таймеров такой

1.жки выбираем чтоб загнал цифру и забыл

2.кнопки можно резистивную шинку на один пин (то есть купить щиток готовый) кнопка жмешь циферка на единичку добавилась 

ножек остается много можно и идивидульно повесить

3. вромя подольше отмеряеть удобно библиотечкой millis

стартанул запомнил millis-ом

прогон текста летит кнопки опрашиваешь и сраниваешь с разницами текущего и запомненного от millis

принимаешь решения

4.твой текст вроде классический а местные косячки сам отловишь

5. мнеб вольт-люксовые характеристики посмотреть для светодиодов включеных раком германиевых транзисторов включенных как угодно

6 библиотечка bounse это от дребезга контактов лишнее это

внутреннемикрушным резистором к плюсу кнопку подтяни INPUT_PULLUP и кнопки тыкая на корпус не дребезжат

ну если питание не дребезжит

и вообще прямо в это ветке все уже решалось просто почитай

вроде с таймером так и называется кухонный таймер на три страницы базары развели из-за того что не слушали меня по пункту 1-ому и полезли в динамические индикации с дурацким регистром

P.S.посмотрел на твою схему. Опять двадцать пять почему все без драйверов запоминающих типа max7219 берете? Отправил цифру и забыл. Опять бла-бла-бла на минимум три страницы. Почему у меня всегда в одну страницу помещается проект? Что я делаю не так? Ой чувствую и вольт-люксовую характеристику прийдется как на лабораторках карандашиком в клетчатой тетрадочке самому рисовать. Самому себе лабу защищать. Самому у себя принимать защиту.

 

Схема плохая.

При стоимости ~40$ економия 1$ на корпусе драйвера требует кучу дурацкого кода расписывать.

 

 

 

 

 

kinesis
Offline
Зарегистрирован: 26.09.2014

art100 пишет:

Тоже интересно.

Светодатчиком светодиод в обратном включении?

А марку помнишь?

Может встречал свето-вольтовую характеристику какую-нибудь?

5. мнеб вольт-люксовые характеристики посмотреть для светодиодов включеных раком германиевых транзисторов включенных как угодно

вроде с таймером так и называется кухонный таймер на три страницы базары развели из-за того что не слушали меня по пункту 1-ому и полезли в динамические индикации с дурацким регистром

честно говоря, ответа не понял :) при чем тут светодиод с обратным включением и свх ....

ощущение что темой ошиблись.

но про кухонный таймер поищу, спасибо.

art100
Offline
Зарегистрирован: 09.03.2014

kinesis пишет:

art100 пишет:

Тоже интересно.

Светодатчиком светодиод в обратном включении?

А марку помнишь?

Может встречал свето-вольтовую характеристику какую-нибудь?

5. мнеб вольт-люксовые характеристики посмотреть для светодиодов включеных раком германиевых транзисторов включенных как угодно

вроде с таймером так и называется кухонный таймер на три страницы базары развели из-за того что не слушали меня по пункту 1-ому и полезли в динамические индикации с дурацким регистром

честно говоря, ответа не понял :) при чем тут светодиод с обратным включением и свх ....

ощущение что темой ошиблись.

но про кухонный таймер поищу, спасибо.

что у тебя датчиком света ?

на 12 ноге ?

art100
Offline
Зарегистрирован: 09.03.2014

 

изучай

как код простой пишется

на таком например

http://ru.aliexpress.com/item/FreeShipping-5PCS-LOT-MAX7219-Led-Module-8-Digit-7-Segment-Digital-LED-Display-Tube-For-Arduino/1995254787.html

kinesis
Offline
Зарегистрирован: 26.09.2014

art100 пишет:

что у тебя датчиком света ?

на 12 ноге ?

никакого датчика нет в принципе, он и не нужен!

на 12 ноге -  нагрузка (сейчас это просто светодиод, будет реле).

в описании все сказано вроде...

faraddin
Offline
Зарегистрирован: 11.08.2013

Напишите мигалку диодом (blink) но только вместо delay() пользуйтесь возможностями millis() и тогда Вам все должно стать понятно

art100
Offline
Зарегистрирован: 09.03.2014

какой-же это

Фото-таймер

а я размечтался

щас еще 10$ буду ежемесячно экономить к уже примененным фото-измерителем и обнаружженным 20$ ежемесячной экономии

а тут

обычная курсовая на халяву из нас вытягиваться будет

с плохой схемой классического таймера

 

kinesis
Offline
Зарегистрирован: 26.09.2014

art100 пишет:

какой-же это

Фото-таймер

а я размечтался

щас еще 10$ буду ежемесячно экономить к уже примененным фото-измерителем и обнаружженным 20$ ежемесячной экономии

а тут

обычная курсовая на халяву из нас вытягиваться будет

с плохой схемой классического таймера

что значит какой? я же в описании сразу написал его задачу: "он нужен для включения фотоувеличителя на определенный промежуток времени"!

или читать описание теперь не принято?

о чем размечтался?

я ни из кого ничего не вытягиваю. спросил совета.

нет желания отвечать - проходим мимо. не надо засорять тему безумными советами, не разобравшись в вопросе.

art100
Offline
Зарегистрирован: 09.03.2014

kinesis пишет:

art100 пишет:

какой-же это

Фото-таймер

а я размечтался

щас еще 10$ буду ежемесячно экономить к уже примененным фото-измерителем и обнаружженным 20$ ежемесячной экономии

а тут

обычная курсовая на халяву из нас вытягиваться будет

с плохой схемой классического таймера

что значит какой? я же в описании сразу написал его задачу: "он нужен для включения фотоувеличителя на определенный промежуток времени"!

или читать описание теперь не принято?

о чем размечтался?

я ни из кого ничего не вытягиваю. спросил совета.

нет желания отвечать - проходим мимо. не надо засорять тему безумными советами, не разобравшись в вопросе.

учишь уму разуму учишь

даже спасибо не говорят

а потом будут стонать - задолбало расписывание динамической индикации на бездрайверные светодиоды

а потом будут стонать - замучался тупусы к не туда засвечивающие светодиоды гасить рассматривать

на дарю вот только что мышкой накалякал схему правильную

вместо фото-сенсора можешь цепочкой на резистивной шине кнопки воткнуть 

можешь на каждую свободную ногу воткнуть

и крути цифры вверх вниз

подсветка на ЖКИ совсем никакая но видно и доп переменником подрегулировать на месте можно

у меня 1-один на общую яркость при денвоном свете

можно добавить второй подсветку в темном помещении

а светодиоды в темном помещении будут засвечивать что нужно и что не нужно в зависмости как ты будешь локтями махать

схема не жрет ничерта

и пока просядет с 12 вольт до 7-ми может год другой пройти не выключаясь

и код писать в разы проще

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

 

art100 , ты знаешь что такое фотоувеличитель? Что ты к человеку прилип с фотодатчиком? Ты знаешь как делались фотографии в доцифровую эпоху?

kinesis- уменьшить значительно влияние дребезга помогают конденсаторы на 100 нанофарад (приблизительно), подключенные паралельно кнопкам. Это избавит от использования дополнительных библиотек.

Для паузы будет еще одна кнопка? Я бы использовал кнопку FOCUS:    при незапущеном таймере включаем и выключаем фотоувеличитель для настройки резкости, а при запущенном отсчете-включаем и отключаем режим PAUSE

Согласен с art100 насчет MAX7219. Проще код и есть возможность менять яркость свечения семисегментников.

art100
Offline
Зарегистрирован: 09.03.2014

nikolaki пишет:

 

art100 , ты знаешь что такое фотоувеличитель? Что ты к человеку прилип с фотодатчиком? Ты знаешь как делались фотографии в доцифровую эпоху?

kinesis- уменьшить значительно влияние дребезга помогают конденсаторы на 100 нанофарад (приблизительно), подключенные паралельно кнопкам. Это избавит от использования дополнительных библиотек.

Для паузы будет еще одна кнопка? Я бы использовал кнопку FOCUS:    при незапущеном таймере включаем и выключаем фотоувеличитель для настройки резкости, а при запущенном отсчете-включаем и отключаем режим PAUSE

Согласен с art100 насчет MAX7219. Проще код и есть возможность менять яркость свечения семисегментников.

гыыы

щс меня будут учит проявке фиксажу

давай

 

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

art100  ,  ты чего разгорячился ? учить тебя никто и не собирался. Бог с тобой .

 

kinesis
Offline
Зарегистрирован: 26.09.2014

nikolaki пишет:

kinesis- уменьшить значительно влияние дребезга помогают конденсаторы на 100 нанофарад (приблизительно), подключенные паралельно кнопкам. Это избавит от использования дополнительных библиотек.

Для паузы будет еще одна кнопка? Я бы использовал кнопку FOCUS:    при незапущеном таймере включаем и выключаем фотоувеличитель для настройки резкости, а при запущенном отсчете-включаем и отключаем режим PAUSE

Согласен с art100 насчет MAX7219. Проще код и есть возможность менять яркость свечения семисегментников.

про конденсаторы не знал, надо будет попробовать. но для кнопок в данном варианте я не использую никаких библиотек, это я сначала попробовал Bounce, но потом отказался из-за невозможности ей обрабатывать долгое нажатие.

для паузы я планировал использовать ту же кнопку "RUN", которой запускается обратный отсчет. как бы она запускает и на паузу ставит при необходимости. а FOCUS только для наводки на резкость оставить.

вот этот момент с кнопками мне никак не понятен. может у меня не правильная логика программы!? как переназначить кнопке RUN паузу во время отсчета?

так же еще этот странный момент с 9.8, которые таймер просто проскакивает :)

про MAX7219 я понял, но хотел сделать из 7-сегментного который у меня уже есть в наличии. но в дальнейшем подумаю над этим.

спасибо за советы!

art100
Offline
Зарегистрирован: 09.03.2014

kinesis пишет:
...про MAX7219 я понял, но хотел сделать из 7-сегментного который у меня уже есть в наличии. но в дальнейшем подумаю над этим.

спасибо за советы!

незачем твои светодиодный выкидавать просто прослоечку вставить чтоб код упростился и ты думал только о том что кнопки делать будут. я же фоток накидал 1 корпус микрухи 8-ем 7-ми семисегментников поддерживает тебе достачтно для часов 4 пользовать от одного корпуса. цифру выбрал кинул и забыл. ты щас столько времени на код убьешь борясь за динамическую индикацию. для проявки прилично релюшку на лампу 220в иметь еще

всегда пожалуйсто

vvadim
Offline
Зарегистрирован: 23.05.2012

art100 наверное думает, что 

незачем твои светодиодный выкидавать просто прослоечку вставить чтоб код упростился и ты думал только о том что кнопки делать будут. я же фоток накидал 1 корпус микрухи 8-ем 7-ми семисегментников поддерживает тебе достачтно для часов 4 пользовать от одного корпуса. цифру выбрал кинул и забыл. ты щас столько времени на код убьешь борясь за динамическую индикацию. для проявки прилично релюшку на лампу 220в иметь еще

 

написал понятный и толковый текст - может пора уже орфографией заняться .

Ощущение опережения мысли и полной несогласованности с набором текста.

Coolerr
Offline
Зарегистрирован: 30.06.2014
#define SEC 9                                                 
#define DSEC 10                                                
#define MIN 11                                                                                                                         
#define ON HIGH                                               
#define OFF LOW 
#define buttonStart 14
#define buttonSet 16
#define buttonInc 12
#define buttonDec 15
#define relay 3 
#define dp 2                                 
unsigned long oldtime=0;
unsigned long debouns=0;
byte razr[3];                                                
int simbol[]={64,121,36,48,25,18,2,120,0,16};      
unsigned int es=0;                                
unsigned int ds=0;                              
unsigned int em=0;
boolean flag=0;
boolean Start=0;
boolean Stop=0;
boolean Set=0;
boolean Inc=0;
boolean Decr=0;
boolean Sbros=0;                     
void setup() {
pinMode(0,OUTPUT);pinMode(1,OUTPUT);
pinMode(4,OUTPUT);pinMode(5,OUTPUT);
pinMode(6,OUTPUT);pinMode(7,OUTPUT);
pinMode(8,OUTPUT);pinMode(9,OUTPUT);
pinMode(10,OUTPUT);pinMode(11,OUTPUT);
pinMode(buttonSet,INPUT);
pinMode(buttonStart,INPUT);pinMode(buttonInc,INPUT);
pinMode(buttonDec,INPUT);pinMode(relay,OUTPUT);
pinMode(dp,OUTPUT);
digitalWrite(buttonStart,HIGH);digitalWrite(buttonSet,HIGH);
digitalWrite(buttonInc,HIGH);digitalWrite(buttonDec,HIGH);
}
void loop()                                               
{
if(millis()-debouns>200){
Start=digitalRead(buttonStart);
Set=digitalRead(buttonSet);
Inc=digitalRead(buttonInc);
Decr=digitalRead(buttonDec);
if(Start==true&&Sbros==false)ustavka();
if(Start==false&&Sbros==false) schet();
debouns=millis();
}
print();
}
void ustavka(){
   if(Set==false)flag=!flag;
      if(flag==0){
        if(Inc==false&&ds<5)ds++;
        if(Decr==false&&ds>0)ds--;
                }
      if(flag==1){
        if(Inc==false&&em<9)em++;
        if(Decr==false&&em>0)em--;
                 }
                }

void schet()
{
digitalWrite(relay,ON);
delay(1000);
Sbros=true;
             while(es+ds+em>0)
                {
                digitalWrite(dp,ON);
                if(millis()-oldtime>1040UL)
                    { 
                    digitalWrite(dp,OFF);
                     es--;
                      if(es>9)
                      {
                      es=9;
                      ds--;
                      if(ds>5)
                        {
                        ds=5;
                        em--;
                        if(em>9)em=9;
                        }
                       }
                      oldtime=millis();  
                     }
                  print();
                  Stop=digitalRead(buttonStart);
                    if(Stop==false)
                       {
               Sbros=false;
               digitalWrite(relay,OFF);
               return;
                       }
                 }
              Sbros=false;
              digitalWrite(relay,OFF);
}

void print(){
razr[2]=simbol[em];
razr[1]=simbol[ds];
razr[0]=simbol[es];
digitalWrite(MIN,ON);                                      
PORTD=razr[2];
delay(5);
digitalWrite(MIN,OFF);
digitalWrite(DSEC,ON);
PORTD=razr[1];
delay(5);
digitalWrite(DSEC,OFF);
digitalWrite(SEC,ON);
PORTD=razr[0];
delay(5);
digitalWrite(SEC,OFF);
}

Код для таймера засветки фоторезиста, 3 разряда. Шаг задания 10 сек. Пуск стоп одной кнопкой, в паузе возможно менять время. Контроллер Attiny 2313 8мГц.

kinesis
Offline
Зарегистрирован: 26.09.2014

Coolerr, спасибо за пример кода, попробую переделать под свои нужды.