Нужна помощь!
- Войдите на сайт для отправки комментариев
Ср, 21/01/2015 - 02:34
При нажатии на кнопку «Старт\Стоп» на индикатор выводится случайное число от 0000 до 9999 через заданный промежуток времени (от 5 до 7 сек.). При повторном нажатии вывод приостанавливается.
Написал скейтч, но столкнулся с проблеммой, при повторном нажатии приходиться кнопку держать 5секк, что бы остановить вывод чисел. что мне делать
long randNumber;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ButPin = 8;
int regim=1;
int flag=0;
void setup()
{ lcd.begin(16, 2);
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop()
{
if(digitalRead(ButPin)==HIGH&&flag==0)
{
regim++;
flag=1;
if(regim>2)
{
regim=1;
}
}
if(digitalRead(ButPin)==LOW&&flag==1)
{
flag=0;
}
if(regim==1)
{lcd.noDisplay();
}
if(regim==2)//второй режим
{ lcd.display();
lcd.setCursor(0, 0);
randNumber = random(9999);
lcd.println(randNumber);
delay(500) ;
}
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
для чего переменные режим и флаг ?
программа должна каждые 5 сек генерировать случайное число, а после нажати кнопки ничего не делать и погасить экран ?
да
я понял , что нужно обойти оператор delay верно?
Ага. Завести переменную типа unsigned long и в неё записывать millis. Всё что нужно задержать, поместить внутрь условия if(millis()-timestamp>=time), обновлять переменную (unsigned long timestamp) тоже внутри условия. По другому называется Blink without delay(). А ещё человек 15 за месяц эту тему спрашивают, в среднем. AWGTHTGTTA?
Да, возможно я зануда, но regim надо переименовать в mode. Напrягает.
#include <LiquidCrystal.h> LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); int ButPin = 8; // кноку от пина на землю boolean onOff; unsigned long time; //========================================================================== void setup() { pinMode( ButPin , OUTPUT ); digitalWrite( ButPin , HIGH ); // подтяжка lcd.begin( 16 , 2 ); randomSeed( analogRead( 0 ) ); onOff = 0; time = millis(); } //========================================================================== void loop() { if ( digitalRead( ButPin ) == 0 ) // тут надо убрать дребезг контактов { onOff = ! onOff; } if ( ! onOff ) { lcd.noDisplay(); } if ( onOff ) { if ( ( millis() - time ) > 5000 ) { lcd.display(); lcd.setCursor( 0 , 0 ); lcd.println( random( 9999 ) ); time = millis(); } } } //==========================================================================#include <LiquidCrystal.h> LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); int ButPin = 8; // кноку от пина на землю boolean onOff; unsigned long time; //========================================================================== void setup() { pinMode( ButPin , OUTPUT ); digitalWrite( ButPin , HIGH ); // подтяжка lcd.begin( 16 , 2 ); randomSeed( analogRead( 0 ) ); onOff = 0; time = millis(); } //========================================================================== void loop() { if ( digitalRead( ButPin ) == 0 ) // тут надо убрать дребезг контактов { onOff = ! onOff; } if ( ! onOff ) { lcd.noDisplay(); } if ( onOff ) { if ( ( millis() - time ) > 5000 ) { lcd.display(); lcd.setCursor( 0 , 0 ); lcd.println( random( 9999 ) ); time = millis(); } } } //==========================================================================строка 40 и дальше - повтор , руки корявые :)
в строку 23 - delay( 30 ); - можно и так дребезг победить
Спасибо, но запускаю Ваш код в протеусе, и нечего не работает
кнонка, нано - смотрите в мониторе
выключается.... а снова не запускается :( , надо искать :)
#include <LiquidCrystal.h> LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); int ButPin = 8; // кноку от пина на землю boolean onOff; unsigned long time; //========================================================================== void setup() { Serial.begin( 9600 ); pinMode( ButPin , OUTPUT ); digitalWrite( ButPin , HIGH ); // подтяжка lcd.begin( 16 , 2 ); randomSeed( analogRead( 0 ) ); onOff = 1; time = millis(); } //========================================================================== void loop() { if ( digitalRead( ButPin ) == 0 ) // тут надо убрать дребезг контактов { onOff = ! onOff; } if ( ! onOff ) { Serial.println( "OFF" ); lcd.noDisplay(); } if ( onOff ) { if ( ( millis() - time ) > 1000 ) { lcd.display(); lcd.setCursor( 0 , 0 ); Serial.println( random( 9999 ) ); lcd.println( random( 9999 ) ); time = millis(); } } } //==========================================================================вот так работает, но нужно бороться с дребезгом - не чётко режим переключается
#include <LiquidCrystal.h> LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); int ButPin = 8; // кноку от пина на землю boolean onOff; unsigned long time; //========================================================================== void setup() { Serial.begin( 9600 ); pinMode( ButPin , OUTPUT ); digitalWrite( ButPin , HIGH ); // подтяжка lcd.begin( 16 , 2 ); randomSeed( analogRead( 0 ) ); onOff = 1; time = millis(); } //========================================================================== void loop() { if ( digitalRead( ButPin ) == 0 ) // тут надо убрать дребезг контактов { onOff = ! onOff; } delay( 25 ); if ( ! onOff ) { Serial.println( "OFF" ); lcd.noDisplay(); } if ( onOff ) { if ( ( millis() - time ) > 1000 ) { lcd.display(); lcd.setCursor( 0 , 0 ); Serial.println( random( 9999 ) ); lcd.println( random( 9999 ) ); time = millis(); } } } //==========================================================================Спасибо, все вроде работает, но запуск самого процесса идет тоже с задержкой, можно ли это как то убрать?
можно
#include <LiquidCrystal.h> LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); int ButPin = 8; // кноку от пина на землю boolean onOff; unsigned long time; boolean start; //========================================================================== void setup() { Serial.begin( 9600 ); pinMode( ButPin , OUTPUT ); digitalWrite( ButPin , HIGH ); // подтяжка lcd.begin( 16 , 2 ); randomSeed( analogRead( 0 ) ); onOff = 1; time = millis(); start = 1; } //========================================================================== void loop() { if ( start ) { lcd.display(); lcd.setCursor( 0 , 0 ); Serial.println( random( 9999 ) ); lcd.println( random( 9999 ) ); start = 0; } if ( digitalRead( ButPin ) == 0 ) // тут надо убрать дребезг контактов { onOff = ! onOff; } delay( 100 ); if ( ! onOff ) { Serial.println( "OFF" ); lcd.noDisplay(); } if ( onOff ) { if ( ( millis() - time ) > 5000 ) { lcd.display(); lcd.setCursor( 0 , 0 ); Serial.println( random( 9999 ) ); lcd.println( random( 9999 ) ); time = millis(); } } } //==========================================================================