Eprom do Arduino


#1

Olá pessoal sou da área de eletrônica mas estou me interessando por programação em arduino. Fiz a junção de dois códigos e de circuitos diferentes para formar um alarme mas agora gostaria de saber se é possivel implementar neste código alguma instrução que grave na eprom a última cronometragem (timming) e em qual parte do código, para que ao final da contagem, ele retorne ao valor inicial. Caso reu precisasse resetar, usaria o pushboton do arduino.
Ficaria agradecido por alguma ajuda.
segue abaixo o código para que possam analisar

#include <LiquidCrystal.h>

LiquidCrystal lcd( 12, 11, 5, 4, 3, 2);
int led = 13;
int segundo = 0;
int minuto = 0;
const int LED13 = 13;
const int Buzzer = A2;
const int Botao1 = A5;
const int Botao2 = A4;
const int Botao3 = A3;

const int pinobotao = 6;
const int pinoopto = 8;
int estadobotao = 0;

//continua
int EstadoBotao1 = 0;
int EstadoBotao2 = 0;
int EstadoBotao3 = 0;

void setup()
{
pinMode(led, OUTPUT);

pinMode(pinoopto, OUTPUT);
pinMode(pinobotao, INPUT);

pinMode(Botao1, INPUT);
pinMode(Botao2, INPUT);
pinMode(Botao3, INPUT);
pinMode(LED13,OUTPUT);
pinMode(Buzzer,OUTPUT);
lcd.begin(16, 2);
inicializacao();
}

void loop() {

EstadoBotao1 = digitalRead(Botao1);
if (EstadoBotao1 == HIGH){
	delay(150);
	segundo++;
      	if(segundo>=60){
  		segundo=0;
  		lcd.setCursor(11,0);
  		lcd.print(" ");
	}
	lcd.setCursor(0,0);
	lcd.print("Segundos: ");
	lcd.print(segundo);
}

EstadoBotao2 = digitalRead(Botao2);
if (EstadoBotao2 == HIGH){
	delay(150);
	if (EstadoBotao2 == HIGH){
  		minuto++;
  		if(minuto>=60){
    		minuto=0;
    		lcd.setCursor(10,1);
    		lcd.print(" ");
  		}
  	lcd.setCursor(0,1);
  	lcd.print("Minutos: ");
  	lcd.print(minuto);
	}
}

EstadoBotao3 = digitalRead(Botao3);
if (EstadoBotao3 == HIGH){
    if((minuto==0) && (segundo==0))     
  
    
    
    
    {
      
    } 
      else          
    
    {
		lcd.clear();
    	lcd.setCursor(0,0);
        lcd.print("	START ");}
  
      {digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
       delay(1000);               // wait for a second
       //digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
       delay(1000);} 
    
       
        digitalWrite(pinoopto, HIGH); 
        
        digitalWrite(pinoopto, LOW);     
           
        estadobotao = digitalRead(pinobotao);
  if (estadobotao == HIGH)
                   
                    
		delay(1000);                  
  
                   
		if(segundo==0){
  			minuto--;
  			segundo=59;}      
        
		for(int y = 0; y<segundo; y--){
  			if(minuto<10){
	    		lcd.setCursor(5,1);
    			lcd.print("0");
    			lcd.print(minuto);
    			lcd.print(":");
			} else {
    			lcd.setCursor(5,1);
    			lcd.print(minuto);
    			lcd.print(":");
			}
			
			if(segundo<10){
				lcd.print("0");
			    lcd.print(segundo);
			} else {
			    lcd.print(segundo);
			}
			
			segundo--;
			
			if(segundo<0){
			    minuto--;
			    segundo=59;
			}
     
			 digitalWrite(pinoopto, HIGH); 
        delay(1000); 

        digitalWrite(pinoopto, LOW);          
      
     
        estadobotao = digitalRead(pinobotao);
          
                  
			delay(1000); 
			
			if((segundo<=0) && (minuto<=0)) {
				lcd.clear();
			    lcd.setCursor(0,0);
              
               digitalWrite(led, LOW);    
			   
              lcd.print("fim da contagem!");
                digitalWrite(Buzzer,HIGH);
			    delay(250);
			    digitalWrite(Buzzer,LOW);
			    delay(100);
			    digitalWrite(Buzzer,HIGH);
			    delay(250);
			    digitalWrite(Buzzer,LOW);
			    delay(100);
			    digitalWrite(Buzzer,HIGH);
			    delay(250);
			    digitalWrite(Buzzer,LOW);
			    delay(100);
			    digitalWrite(Buzzer,HIGH);
			    delay(1000);
			    digitalWrite(Buzzer, LOW);
			    break; //sai do loop for
			}
		}
		
		inicializacao();
	}
}

void inicializacao(){
lcd.begin(16, 2);
lcd.print("Selecione o ");
lcd.setCursor(0,1);
lcd.print(“tempo do timer…”);
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Segundos: ");
lcd.print(segundo);
lcd.setCursor(0,1);
lcd.print("Minutos: ");
lcd.print(minuto);
}


#2

você pode fazer mais ou menos assim:


#3

Agradeço pela resposta, mas ainda estou precisando entender como inserir o código que ira extrair o tempo programado e em qual parte do programa


#4

Vou dar uma sugestão em relação a isso. Você quer selecionar o tempo pelos botões, certo?
Parece que o mais adequado é ter um botão para mudar o valor, um botão para mudar de campo (H:M:S) e um botão para gravar. Se vocẽ errar em algum campo, com o botão de mudança de campo você poderá voltar e corrigir. nesse caso, você poderia fazer uma adaptação mais ou menos assim:

byte counter = -1;
int cronometer[3] = {0};

Use interrupção para pegar eventos do botãode mudança de campo. Quando ocorrer um evento, incremente o contador.

void sua_isr(){
    counter = counter > 1 ? 0 : counter+1;
}

Crie uma interrupção para gravar os dados. Você terá hora, minuto e segundo no array cronometer. quando mandar gravar, apenas guarde cada campo em um endereço a eeprom.

void outra_isr(){
  ....
rotina para pegar cada campo do cronometro e gravar na memória
}

onde colocar essa chamada ?
Em lugar nenhuma, apenas instancie as interrupções na função setup() e quando um evento ocorrer, elas serão chamadas em qualquer ponto da execução do seu código.