Go Down

Topic: cronometro (Read 369 times) previous topic - next topic

MarcoMix

Mar 27, 2019, 04:34 pm Last Edit: Mar 30, 2019, 03:42 pm by MarcoMix
Code: [Select]
/*
test cronometro con pulsante e led
*/
#include <LiquidCrystal.h>

//Inizializza i PIN per il controllo del display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte START = 10;    
const byte STOP = 6;
boolean StatusStart;  
boolean StatusStop;
boolean StatusLed = LOW;
boolean CounterGo = false;
boolean LedOn = false;

unsigned long StartTime = 0;
unsigned long CurrentTime = 0;
unsigned long PreviousMillis = 0;
unsigned long CurrentMillis = 0;

void setup()  
{
 lcd.begin(16, 2);
 lcd.print("  Cronometro  ");

 pinMode(LED_BUILTIN, OUTPUT);      //Impostazione PIN come uscita
 pinMode(START, INPUT_PULLUP);  //Impostazione PIN come ingresso con pull-up
 pinMode(STOP, INPUT_PULLUP);
} // End setup

void loop()  
{
 StatusStart = digitalRead(START);
 StatusStop = digitalRead(STOP);
 delay(20);

 CurrentMillis = millis();
 CurrentTime = CurrentMillis;
 unsigned long FinishTime = StartTime - CurrentTime;

 if (StatusStart == LOW && CounterGo == false)
 {      
   StartTime = CurrentTime;
   LedOn = true;
   CounterGo = true;
 }

 if (StatusStop == LOW)
 {      
   LedOn = false;
   CounterGo = false;
   RefreshDisplay(FinishTime);
   delay(1000);
 }

 if (StatusStop == LOW && CounterGo == false) // Reset Counter
 {      
   StartTime = 0;
   LedOn = false;
   CounterGo = false;
   RefreshDisplay(StartTime);
   delay(1000);
 }

 if (CounterGo == true)
 {
   if ((CurrentMillis - PreviousMillis) > 500)
   {
     RefreshDisplay(FinishTime);
     PreviousMillis = CurrentMillis;
     StatusLed != StatusLed;
   }
 }
 
 if (LedOn == true) digitalWrite(LED_BUILTIN, StatusLed);
} // End Loop

void RefreshDisplay(unsigned long TS) {
 unsigned int Secondi = TS%60;
 TS /= 60;
 unsigned int Minuti = TS%60;
 TS /= 60;
 unsigned int Ore = TS%24;
 lcd.setCursor(13,10);
 if (Secondi < 10) lcd.print("0");
 lcd.print(Secondi);
 lcd.setCursor(10,10);
 lcd.print(":");
 lcd.setCursor(7,10);
 if (Minuti < 10) lcd.print("0");
 lcd.print(Minuti);
}

ciao a tutti
avevo provato a rispondere ad una vecchia discussione ma mi hanno cancellato il messaggio...
ho provato ad implementare una sirena, comandata da un relè, (nello scketch qui sopra) che suona quando si avvia e si stoppa il cronometro, ma non so come mai la sirena impazzisce e comincia a fare un suono ogni secondo...
sapete aiutarmi per implementare tale funzione nello sketch qui sopra? spero di si perchè sono qua da due giorni che ci "picchio la testa"...
grazie a tutti in anticipo
Marco

Standardoil

Io direi che usare il pin 11 per due differenti scopi non è buona cosa...
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

gpb01

#2
Mar 27, 2019, 04:48 pm Last Edit: Mar 27, 2019, 04:50 pm by gpb01
avevo provato a rispondere ad una vecchia discussione ma mi hanno cancellato il messaggio...
Magari una ripassatina al REGOLAMENTO, punto 16.9, farebbe bene. ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

MarcoMix

si si, ho incollato la versione sbagliata... l'avevo già corretto, scusate

Standardoil

Ma la sirena è connessa al led built-in?
Se sì è ovvio che faccia mezzo secondo on e mezzo off
Tu la spegni solo quando premi stop... per ol resto del tempo la fai andare a intetmittenza
Anzi ti va bene che non Hai mai fermato intermittenza  avsirena accesa, che non si sarebbe mai spenta...
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

MarcoMix

no la sirena l'ho connessa al pin 7 ed ho implementato una accensione ed uno spegnimento dopo 1.5 sec quando viene richiamato all'if statusstop e all'if statusstart.
ma non riesco a farla funzionare...
appena riesco vi carico il codice

Standardoil

#6
Mar 30, 2019, 03:00 pm Last Edit: Mar 30, 2019, 03:01 pm by Standardoil
Cioè vuoi dire che per due volte hai incollato il programma sbagliato?
Fai così stavolta: controlla bene che sia quello giusto, e poi mettilo in un post "suo" non metterlo al posto di quello sbagliato, che poi non si capisce più un acca
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

MarcoMix

#7
Mar 30, 2019, 03:40 pm Last Edit: Mar 30, 2019, 03:40 pm by MarcoMix
no no, mi sono spiegato male io... io avevo implementato il primo codice che ho postato ma non funziionava quandi vi avevo chiesto come inserire una sirena in qual programma.
ora è da 3 giorni che sono fuori casa e non sono ancora riuscito a postare lo skecth con cui ho fatto le prove quindi lo sketch del primo post con le mie aggiunte per far suonare la sirena.
tra due ore artrivo a casa e lo posto!
nel primo non c'è la parte di programma che fa suonare la sirena

Standardoil

Sicuro che sia andata così?
Perché quello al post originale è il secondo programma che hai postato, non il primo
Il primo lo hai sovrascritto...
Insomma, non è chiara, la situazione
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

MarcoMix

no no avevo cambiato solo un numero perchè avevo messo due pin iguali per errore

MarcoMix

Eccolo:
Code: [Select]
/*
test cronometro con pulsante e led
*/
#include <LiquidCrystal.h>

//Inizializza i PIN per il controllo del display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte START = 10;   
const byte STOP = 6;
boolean StatusStart;   
boolean StatusStop;
boolean StatusLed = LOW;
boolean CounterGo = false;
boolean LedOn = false;

unsigned long StartTime = 0;
unsigned long CurrentTime = 0;
unsigned long PreviousMillis = 0;
unsigned long CurrentMillis = 0;

void setup() 
{
 lcd.begin(16, 2);
 lcd.print("  Cronometro  ");
 pinMode(7, OUTPUT);
 pinMode(LED_BUILTIN, OUTPUT);      //Impostazione PIN come uscita
 pinMode(START, INPUT_PULLUP);  //Impostazione PIN come ingresso con pull-up
 pinMode(STOP, INPUT_PULLUP);
} // End setup

void loop() 
{
 StatusStart = digitalRead(START);
 StatusStop = digitalRead(STOP);
 delay(20);

 CurrentMillis = millis();
 CurrentTime = CurrentMillis;
 unsigned long FinishTime = StartTime - CurrentTime;

 if (StatusStart == LOW && CounterGo == false)
 {       
  digitalWrite(7, HIGH);
  delay(1000);           
  digitalWrite(7, LOW);
   StartTime = CurrentTime;
   LedOn = true;
   CounterGo = true;
 }

 if (StatusStop == LOW)
 {       
  digitalWrite(7, HIGH);
  delay(1000);           
  digitalWrite(7, LOW);
   LedOn = false;
   CounterGo = false;
   RefreshDisplay(FinishTime);
   delay(1000);
 }

 if (StatusStop == LOW && CounterGo == false) // Reset Counter
 {       
   StartTime = 0;
   LedOn = false;
   CounterGo = false;
   RefreshDisplay(StartTime);
   delay(1000);
 }

 if (CounterGo == true)
 {
   if ((CurrentMillis - PreviousMillis) > 500)
   {
     RefreshDisplay(FinishTime);
     PreviousMillis = CurrentMillis;
     StatusLed != StatusLed;
   }
 }
 
 if (LedOn == true) digitalWrite(LED_BUILTIN, StatusLed);
} // End Loop

void RefreshDisplay(unsigned long TS) {
 unsigned int Secondi = TS%60;
 TS /= 60;
 unsigned int Minuti = TS%60;
 TS /= 60;
 unsigned int Ore = TS%24;
 lcd.setCursor(13,10);
 if (Secondi < 10) lcd.print("0");
 lcd.print(Secondi);
 lcd.setCursor(10,10);
 lcd.print(":");
 lcd.setCursor(7,10);
 if (Minuti < 10) lcd.print("0");
 lcd.print(Minuti);
}

Standardoil

#11
Mar 30, 2019, 06:52 pm Last Edit: Mar 30, 2019, 07:10 pm by Standardoil
esattamente cosa ti succede?
il programma non è il massimo, ma dovrebbe funzionare correttamente, quindi spiega bene che problema ti da
in particolare lcd.setCursor(  con un numero di riga maggiore del numero righe del display non so bene come vada, ma comunque non dovrebbe dare il problema che lamenti
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Silente

Ho dato un occhio al tuo programma e non ho capito cosa dovrebbe fare. Il mio consiglio é di spiegarlo in italiano, così da fugare un po di dubbi e confusioni
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

Go Up