Таймер. Срочные вопросы.

redgreen58
Offline
Зарегистрирован: 21.01.2015

Всем привет!

Таймер. После запуска выводится обратный отсчёт (10 минут). С помощью 2 кнопок «+» и «-» можно менять это время с кратностью 10 секунд. По достижении требуемого значения времени отсчёт продолжает вестись в прямом направлении.

Вопрос. Как вывести обратный отсчёт именно в минутах, а не как у меня в секундах? И еще при тестировании кнопки "+" и "-" работают с задержкой. Как исправить?

Вот моя наработка.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ButPin1 = 8; 
int ButPin2 = 7;  
int a;
 
void setup() {
  lcd.begin(16, 2); 
  a=600;
}
 
void loop() {
  a=a-1;
  lcd.setCursor(0, 0); 
  lcd.print(a);
  lcd.setCursor(0, 0);
  if(digitalRead(ButPin1) == HIGH)      
  {
    a=a-10;
  }
  if(digitalRead(ButPin2) == HIGH)      
  {
    a=a+10;
  }
 
  delay(500);
}
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

http://www.arduino.ru/forum/programmirovanie/nuzhna-pomoshch-5

там половину ответов найдёте :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

дык, спрашивайте... если что :) 

redgreen58
Offline
Зарегистрирован: 21.01.2015

SU-27-16 пишет:

http://www.arduino.ru/forum/programmirovanie/nuzhna-pomoshch-5

там половину ответов найдёте :)

 

Посмотрел тут и на сколько понял нужно избавиться от дребезга. Допустим для одной из кнопок:

if(digitalRead(ButPin1) == 0) 

и дальше делеем подгонять. Так?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вот просто счётчик от 600 до 0 мин

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPin1 8
#define ButPin2 7
int T = 600;
unsigned long time;
//=========================================================
void setup()
{
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
  lcd.setCursor( 0 , 0 ); 
  lcd.print( T );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > 60000 )              // минуты считаем
        {
          T--;
          lcd.setCursor( 0 , 0 );
          lcd.print( T );
        }
    }
  
//  a=a-1;
//  lcd.setCursor(0, 0); 
//  lcd.print(a);
//  lcd.setCursor(0, 0);
//  if(digitalRead(ButPin1) == HIGH)      
//  {
//    a=a-10;
//  }
//  if(digitalRead(ButPin2) == HIGH)      
//  {
//    a=a+10;
//  }
// 
//  delay(500);
}
//=========================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а вот про кнопки

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

эта библиотека для устранения дребезга контактов кнопок, реле   >>>   #include <Bounce.h>

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

извините, в том коде ошибка.... вот код с отсчётом по 2 сек от 600 до 0 , вывод в сериал ( LCD не нужен )

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPin1 8
#define ButPin2 7
int T = 600;
unsigned long time;
//=========================================================
void setup()
{
  Serial.begin( 9600 );
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
  Serial.println( T );
  lcd.setCursor( 0 , 0 ); 
  lcd.print( T );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > 2000 )              // по 2 секунды считаем
        {
          T = T - 2;
          lcd.setCursor( 0 , 0 );
          lcd.print( T );
          Serial.println( T );
          time = millis();
        }
    }
}
//=========================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вам нужен такой вывод ?

600 сек >>>>> 10:00

573 сек >>>>> 9:33

redgreen58
Offline
Зарегистрирован: 21.01.2015

да, вывод такой. но это не столь важно.

важно управление таймером с двух кнопок + 10сек. - 10 сек.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вы в сериалМониторе смотрите ? или только по LCD ?

посмотрите в сериал !!!!!!!!!!! вот типичный пример ДРЕБЕЗГА и к чему он приводит :(

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPlus 8        // кнопки на пин и на землю
#define ButMinus 7
int T = 600;           // секундs
byte shag = 2;         // секундs
unsigned long time;
//=========================================================
void setup()
{
  Serial.begin( 9600 );
  pinMode( ButPlus , INPUT );
  digitalWrite( ButPlus , HIGH );
  pinMode( ButMinus , INPUT );
  digitalWrite( ButMinus , HIGH );
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
          byte Tmin = T / 60;
          byte Tsec = T % 60;
          lcd.setCursor( 0 , 0 );
          lcd.print( Tmin );
          lcd.print( ":" );
          lcd.print( Tsec );
          Serial.print( Tmin );
          Serial.print( ":" );
          Serial.println( Tsec );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > ( shag * 1000 ) )
        {
          T = T - shag;
          byte Tmin = T / 60;
          byte Tsec = T % 60;
          lcd.setCursor( 0 , 0 );
          lcd.print( Tmin );
          lcd.print( ":" );
          lcd.print( Tsec );
          Serial.print( Tmin );
          Serial.print( ":" );
          Serial.println( Tsec );
          time = millis();
        }
    }
    
  if ( digitalRead( ButPlus ) == 0 )     // вот здесь надо бороться с дребезгом !!!!!!!!!!!
    {
      T = T + 10;
      Serial.println( " + 10" );
      lcd.setCursor( 1 , 0 );            // вывод в строку 2 ? или надо - lcd.setCursor( 0 , 1 );
      lcd.print( " + 10" );
    }
  if ( digitalRead( ButMinus ) == 0 )    // вот здесь надо бороться с дребезгом !!!!!!!!!!!
    {
      T = T - 10;
      Serial.println( " - 10" );
      lcd.setCursor( 1 , 0 );
      lcd.print( " - 10" );
    }

// если секунд < 10 - нужно выводить дополнительный 0 !!!!!!!!!!!!
}
//=========================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а вот так - уже стабильнее работает :)

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPlus 8        // кнопки на пин и на землю
#define ButMinus 7
int T = 600;           // секундs
byte shag = 2;         // секундs
unsigned long time;
//=========================================================
void setup()
{
  Serial.begin( 9600 );
  pinMode( ButPlus , INPUT );
  digitalWrite( ButPlus , HIGH );
  pinMode( ButMinus , INPUT );
  digitalWrite( ButMinus , HIGH );
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
          byte Tmin = T / 60;
          byte Tsec = T % 60;
          lcd.setCursor( 0 , 0 );
          lcd.print( Tmin );
          lcd.print( ":" );
          lcd.print( Tsec );
          Serial.print( Tmin );
          Serial.print( ":" );
          Serial.println( Tsec );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > ( shag * 1000 ) )
        {
          T = T - shag;
          byte Tmin = T / 60;
          byte Tsec = T % 60;
          lcd.setCursor( 0 , 0 );
          lcd.print( Tmin );
          lcd.print( ":" );
          lcd.print( Tsec );
          Serial.print( Tmin );
          Serial.print( ":" );
          Serial.println( Tsec );
          time = millis();
        }
    }
    
  if ( digitalRead( ButPlus ) == 0 )     // вот здесь надо бороться с дребезгом !!!!!!!!!!!
    {
      T = T + 10;
      Serial.println( " + 10" );
      lcd.setCursor( 1 , 0 );            // вывод в строку 2 ? или надо - lcd.setCursor( 0 , 1 );
      lcd.print( " + 10" );
    }
  delay( 100 );                           // это пародия на антидребезг !!!!!!!
  if ( digitalRead( ButMinus ) == 0 )    // вот здесь надо бороться с дребезгом !!!!!!!!!!!
    {
      T = T - 10;
      Serial.println( " - 10" );
      lcd.setCursor( 1 , 0 );
      lcd.print( " - 10" );
    }
  delay( 100 );                           // это пародия на антидребезг !!!!!!!

// если секунд < 10 - нужно выводить дополнительный 0 !!!!!!!!!!!!
}
//=========================================================

 

redgreen58
Offline
Зарегистрирован: 21.01.2015

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

redgreen58
Offline
Зарегистрирован: 21.01.2015

очень понравился этот вариант. но еще регулировку в плюс минус 10сек..

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

этот вариант от 600 до 0 через секунду в формате MM:SS

+/- 10 сек - работает ( в сериале отображается "+10" , на LCD во второй строке должно тоже появляться +10 , но не гаснуть, пока не нажмёте -10 )

а ардуинки нету чёли ? надо всего-то = ардуина и два проводка, на землю и на пин8 ( пин7 )

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPlus 8        // кнопки на пин и на землю
#define ButMinus 7
int T = 600;           // секундs
byte shag = 1;         // секундs
unsigned long time;
//=========================================================
void setup()
{
  Serial.begin( 9600 );
  pinMode( ButPlus , INPUT );
  digitalWrite( ButPlus , HIGH );
  pinMode( ButMinus , INPUT );
  digitalWrite( ButMinus , HIGH );
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
          byte Tmin = T / 60;
          byte Tsec = T % 60;
          lcd.setCursor( 0 , 0 );
          lcd.print( Tmin );
            if ( Tsec < 10 ) lcd.print( ":0" );
            else lcd.print( ":" );
          lcd.print( Tsec );
            if ( Tmin < 10 ) Serial.print( "0" );    // с ноликом прикольнее :)
          Serial.print( Tmin );
            if ( Tsec < 10 ) Serial.print( ":0" );
            else Serial.print( ":" );
          Serial.println( Tsec );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > ( shag * 1000 ) )
        {
          T = T - shag;
          byte Tmin = T / 60;
          byte Tsec = T % 60;
          lcd.setCursor( 0 , 0 );
          lcd.print( Tmin );
            if ( Tsec < 10 ) lcd.print( ":0" );
            else lcd.print( ":" );
          lcd.print( Tsec );
            if ( Tmin < 10 ) Serial.print( "0" );    // с ноликом прикольнее :)
          Serial.print( Tmin );
            if ( Tsec < 10 ) Serial.print( ":0" );
            else Serial.print( ":" );
          Serial.println( Tsec );
          time = millis();
        }
    }
    
  if ( digitalRead( ButPlus ) == 0 )     // вот здесь надо бороться с дребезгом !!!!!!!!!!!
    {
      T = T + 10;
      Serial.println( " + 10" );
      lcd.setCursor( 1 , 0 );            // вывод в строку 2 ? или надо - lcd.setCursor( 0 , 1 );
      lcd.print( " + 10" );
    }
  delay( 100 );                           // это пародия на антидребезг !!!!!!!
  if ( digitalRead( ButMinus ) == 0 )    // вот здесь надо бороться с дребезгом !!!!!!!!!!!
    {
      T = T - 10;
      Serial.println( " - 10" );
      lcd.setCursor( 1 , 0 );
      lcd.print( " - 10" );
    }
  delay( 100 );                           // это пародия на антидребезг !!!!!!!

// если секунд < 10 - нужно выводить дополнительный 0 !!!!!!!!!!!!
}
//=========================================================

 

redgreen58
Offline
Зарегистрирован: 21.01.2015

ардуино нет. ардуино в универе)

завтра пойду и там буду подключать, пробовать.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

надо её домой !!!! ей там скучно без вас :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

город какой ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

58.... Пенза ?

redgreen58
Offline
Зарегистрирован: 21.01.2015

завтра я её развлеку)

да, Пенза.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

живёшь в городе или окрестностях ? 

redgreen58
Offline
Зарегистрирован: 21.01.2015

живу в городе, родом из окрестностей.

а что?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

использована функция стандартной библиотеки >>> sprintf( buffer , "%d:0%d" , Tmin , Tsec ); - полезная штука !

вывод прописан в процедуру >>> void toDisplay();

так код проще читать....

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPlus 8
#define ButMinus 7
int T = 600;
byte shag = 1;
unsigned long time;
char buffer[ 10 ];
//=========================================================
void setup()
{
  Serial.begin( 9600 );
  pinMode( ButPlus , INPUT );
  digitalWrite( ButPlus , HIGH );
  pinMode( ButMinus , INPUT );
  digitalWrite( ButMinus , HIGH );
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
  toDisplay();
}
//=========================================================
void toDisplay()
{
  byte Tmin = T / 60;
  byte Tsec = T % 60;
    if ( Tsec < 10 ) sprintf( buffer , "%d:0%d" , Tmin , Tsec );
    else             sprintf( buffer , "%d:%d" , Tmin , Tsec );
  Serial.println( buffer );
  lcd.setCursor( 0 , 0 );
  lcd.print( buffer );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > ( shag * 1000 ) )
        {
          T = T - shag;
          toDisplay();
          time = millis();
        }
    }
    
  if ( digitalRead( ButPlus ) == 0 )
    {
      T = T + 10;
      Serial.println( " + 10" );
    }
  delay( 100 );
  if ( digitalRead( ButMinus ) == 0 )
    {
      T = T - 10;
      Serial.println( " - 10" );
    }
  delay( 100 );
}
//=========================================================

так просто :) , знаю окрестности в плане - Монтажка, Чемодановка, ПтицеФабрика, Кижеватово... город не знаю :( ещё не разуне выбрался из него кроме как на такси :)

elkinpalkin
Offline
Зарегистрирован: 21.01.2015

Здорова! случайно зашел, я так то тоже из Пензы

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ну, и крайняя версия - всегда выводится 5 знакомест - mm:ss

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12 , 11 , 5 , 4 , 3 , 2 );
#define ButPlus 8
#define ButMinus 7
int T = 600;
byte shag = 1;
unsigned long time;
char buffer[ 10 ];
//=========================================================
void setup()
{
  Serial.begin( 9600 );
  pinMode( ButPlus , INPUT );
  digitalWrite( ButPlus , HIGH );
  pinMode( ButMinus , INPUT );
  digitalWrite( ButMinus , HIGH );
  lcd.begin( 16 , 2 ); 
  T = 600;
  time = millis();
  toDisplay();
}
//=========================================================
void toDisplay()
{
  byte Tmin = T / 60;
  byte Tsec = T % 60;
    if ( ( Tsec < 10 ) && ( Tmin < 10 ) ) sprintf( buffer , "0%d:0%d" , Tmin , Tsec );
    if ( ( Tsec < 10 ) && ( Tmin >= 10 ) ) sprintf( buffer , "%d:0%d" , Tmin , Tsec );
    if ( ( Tsec >= 10 ) && ( Tmin < 10 ) ) sprintf( buffer , "0%d:%d" , Tmin , Tsec );
    if ( ( Tsec >= 10 ) && ( Tmin >= 10 ) ) sprintf( buffer , "%d:%d" , Tmin , Tsec );
  Serial.println( buffer );
  lcd.setCursor( 0 , 0 );
  lcd.print( buffer );
}
//=========================================================
void loop()
{
  if ( T )
    {
      if ( ( millis() - time ) > ( shag * 1000 ) )
        {
          T = T - shag;
          toDisplay();
          time = millis();
        }
    }
    
  if ( digitalRead( ButPlus ) == 0 )
    {
      T = T + 10;
      Serial.println( " + 10" );
    }
  delay( 100 );
  if ( digitalRead( ButMinus ) == 0 )
    {
      T = T - 10;
      Serial.println( " - 10" );
    }
  delay( 100 );
}
//=========================================================

а смогнёшь допилить код под вывод 8 знакомест - мин, сек, сотые секунды ?

15:09.47

или вам препод задачи ставит ? :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

elkinpalkin пишет:

Здорова! случайно зашел, я так то тоже из Пензы

:) из СССР я , офицер , щас Питер

elkinpalkin
Offline
Зарегистрирован: 21.01.2015

В Пензе служил?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

нет... у вас там истребателей нету :) , брат - там живёт

elkinpalkin
Offline
Зарегистрирован: 21.01.2015

Ааа, все понятно

redgreen58
Offline
Зарегистрирован: 21.01.2015

Препод)

не, не смогу. да и не стоит.. и так козырно)

Спасибо!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пожста !