Нужна помощь!

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

При нажатии на кнопку «Старт\Стоп» на индикатор выводится случайное число от 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) ;   
  }    
 } 

 

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

для чего переменные режим и флаг ? 

программа должна каждые 5 сек генерировать случайное число, а после нажати кнопки ничего не делать и погасить экран ?

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

да 

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

я понял , что нужно обойти оператор delay верно?

std
Offline
Зарегистрирован: 05.01.2012

Ага. Завести переменную типа unsigned long и в неё записывать millis. Всё что нужно задержать, поместить внутрь условия if(millis()-timestamp>=time), обновлять переменную (unsigned long timestamp) тоже внутри условия. По другому называется Blink without delay(). А ещё человек 15 за месяц эту тему спрашивают, в среднем. AWGTHTGTTA?

Да, возможно я зануда, но regim надо переименовать в mode. Напrягает.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#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();
        }
    }
}
//==========================================================================

 

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

строка 40 и дальше - повтор , руки корявые :)

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

в строку 23 - delay( 30 );   - можно и так дребезг победить

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

Спасибо, но запускаю Ваш код в протеусе, и нечего не работает

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

кнонка, нано - смотрите в мониторе

выключается.... а снова не запускается :( , надо искать :)

#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();
        }
    }
}
//==========================================================================

 

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

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

#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();
        }
    }
}
//==========================================================================

 

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

Спасибо, все вроде работает, но запуск самого процесса идет тоже с задержкой, можно ли это как то убрать?

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

можно

#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();
        }
    }
}
//==========================================================================