Таймер. Срочные вопросы.
- Войдите на сайт для отправки комментариев
Ср, 21/01/2015 - 03:44
Всем привет!
Таймер. После запуска выводится обратный отсчёт (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);
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
http://www.arduino.ru/forum/programmirovanie/nuzhna-pomoshch-5
там половину ответов найдёте :)
дык, спрашивайте... если что :)
http://www.arduino.ru/forum/programmirovanie/nuzhna-pomoshch-5
там половину ответов найдёте :)
Посмотрел тут и на сколько понял нужно избавиться от дребезга. Допустим для одной из кнопок:
if(digitalRead(ButPin1) == 0)
и дальше делеем подгонять. Так?
вот просто счётчик от 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); } //=========================================================а вот про кнопки
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
эта библиотека для устранения дребезга контактов кнопок, реле >>> #include <Bounce.h>
извините, в том коде ошибка.... вот код с отсчётом по 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(); } } } //=========================================================вам нужен такой вывод ?
600 сек >>>>> 10:00
573 сек >>>>> 9:33
да, вывод такой. но это не столь важно.
важно управление таймером с двух кнопок + 10сек. - 10 сек.
вы в сериалМониторе смотрите ? или только по 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 !!!!!!!!!!!! } //=========================================================а вот так - уже стабильнее работает :)
#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 !!!!!!!!!!!! } //=========================================================у меня протеус, в нем и тестирую. а на счет дребезга и как Вы выразились "пародия на антидребегз" уже пробовал. пусть так, меня устроило)
очень понравился этот вариант. но еще регулировку в плюс минус 10сек..
этот вариант от 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 !!!!!!!!!!!! } //=========================================================ардуино нет. ардуино в универе)
завтра пойду и там буду подключать, пробовать.
надо её домой !!!! ей там скучно без вас :(
город какой ?
58.... Пенза ?
завтра я её развлеку)
да, Пенза.
живёшь в городе или окрестностях ?
живу в городе, родом из окрестностей.
а что?
использована функция стандартной библиотеки >>> 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 ); } //=========================================================так просто :) , знаю окрестности в плане - Монтажка, Чемодановка, ПтицеФабрика, Кижеватово... город не знаю :( ещё не разуне выбрался из него кроме как на такси :)
Здорова! случайно зашел, я так то тоже из Пензы
ну, и крайняя версия - всегда выводится 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
или вам препод задачи ставит ? :)
Здорова! случайно зашел, я так то тоже из Пензы
:) из СССР я , офицер , щас Питер
В Пензе служил?
нет... у вас там истребателей нету :) , брат - там живёт
Ааа, все понятно
Препод)
не, не смогу. да и не стоит.. и так козырно)
Спасибо!
пожста !