unione piu' sketch

buonasera a tutti da qualche giorno ho iniziato a programmare una scheda arduino per costruire un cruscotto digitale.
per adesso sto lavorando con una scheda arduino uno ma piu' in avanti perso di sviluppare tutto su una mega.
vi espongo il mio problema, quando accendo la scheda devo fare inizializzare una decina di led con una accensione in sequenza da effettuare solo una volta creato lo sketch provato tutto bene.
dopo di che copiando da internet uno sketch per poter creare un contagiri, modificandolo per il mio bisogno provato anche lui e funzionante , vado ad unire i due sketch e carico sulla scheda il risultato è che mi fa l'inizializzazione ma non come dovuta, in parole povere i led lampeggiano all'infinito e non mi legge i giri sul monitor seriale. in allegato i due file .
qualche consiglio da dare?

contagiri_seriale.ino (1.04 KB)

inizializazione_led.ino (989 Bytes)

int pin3 = 3;
int pin4 = 4;
int pin5 = 5;
int pin6 = 6;
int pin7 = 7;
int pin8 = 8;
int pin9 = 9;
int timer = 250;

void setup()
{
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}

void loop()
{
{
digitalWrite(pin3, HIGH);
delay(timer);

digitalWrite(pin4, HIGH);
delay(timer);

digitalWrite(pin5, HIGH);
delay(timer);

digitalWrite(pin6, HIGH);
delay(timer);

digitalWrite(pin7, HIGH);
delay(500);

digitalWrite(pin7, LOW);
delay(timer);

digitalWrite(pin6, LOW);
delay(timer);

digitalWrite(pin5, LOW);
delay(timer);

digitalWrite(pin4, LOW);
delay(timer);

digitalWrite(pin3, LOW);
delay(timer);

digitalWrite(pin8, HIGH);
digitalWrite(pin9, HIGH);
delay(timer);

digitalWrite(pin8, LOW);
delay(1000);
digitalWrite(pin9, LOW);
delay(1000);
while(true);
}
}

// read RPM
int half_revolutions = 0;
int rpm = 2;
unsigned long lastmillis = 0;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, rpm_fan, FALLING);
}
void loop()
{
if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).
detachInterrupt(0);//Disable interrupt when calculating
rpm = half_revolutions * 30; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
Serial.print("RPM =\t"); //print the word "RPM" and tab.
Serial.print(rpm); // print the rpm value.
Serial.print("\t Hz=\t"); //print the word "Hz".
Serial.println(half_revolutions); //print revolutions per second or Hz. And print new line or enter.
half_revolutions = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
}
}
// this code will be executed every time the interrupt 0 (pin2) gets low.
void rpm_fan(){
half_revolutions++;
}

Sei al tuo 23esimo post ed ancora non hai imparato che, come da regolamento, punto 7, il codice DEVE essere racchiuso tra i tag CODE ? ? ? >:(

E si che è cosa che diciamo ripetutamente qui sul forum ... ::slight_smile:

Edita i tuoi post precedenti ed usa il bottone </>, che in edit è tutto a sinistra, per racchiudere il codice nei suoi tag.

Guglielmo

Ok chiedo scusa sarà valido per i prossimi post a volte la fretta è cattiva consigliera

Se deve farlo solo una volta metti quella sfilza di digitalWrite(pin, H o L); nel setup(), lo farà una sola volta al reset
Però queste sono cose elementarissime, praticamente viene dopo aver spachettato la scheda

L'accensione dei led va fatta una volta. Il resto va fatto ciclicamente, ma quello che mi preoccupa di più è andranno uniti altri sketch. Per questo vorrei risolvere prima questo.

Per questo te l'ho detto, per gli altri non credo troverai qualcuno che lo farà per te, studia bene cosa fanno i singoli sketch e assemblali, se non funziona riprova e riprova.

Messi insieme avviene l inizializazione però parte un ciclo continuo di accensione e spegnimento. Ed il valore rpm non lo legge e non mi compare sul monitor seriale

matita_76:
Ok chiedo scusa sarà valido per i prossimi post ...

No, vale anche per il passato visto che puoi editare e modificare i Tuoi post vecchi.
Ciao Uwe

    int pin3 = 3;
int pin4 = 4;
int pin5 = 5;
int pin6 = 6;
int pin7 = 7;
int pin8 = 8;
int pin9 = 9;
int timer = 250;

void setup()
{
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 pinMode(7,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
}

void loop() 
{
  {
   digitalWrite(pin3, HIGH);
   delay(timer);

   digitalWrite(pin4, HIGH);
   delay(timer);
   
   digitalWrite(pin5, HIGH);
   delay(timer);

   digitalWrite(pin6, HIGH);
   delay(timer);

   digitalWrite(pin7, HIGH);
   delay(500);
 
   digitalWrite(pin7, LOW);
   delay(timer);

   digitalWrite(pin6, LOW);
   delay(timer);
 
   digitalWrite(pin5, LOW);
   delay(timer);
   
   digitalWrite(pin4, LOW);
   delay(timer);

   digitalWrite(pin3, LOW);
   delay(timer);
   
   digitalWrite(pin8, HIGH);
   digitalWrite(pin9, HIGH);
   delay(timer);
  
   digitalWrite(pin8, LOW);
   delay(1000);
   digitalWrite(pin9, LOW);
   delay(1000);
   while(true); 
  }
}
 // read RPM
 int half_revolutions = 0;
 int rpm = 2;
 unsigned long lastmillis = 0;
 void setup()
 {
  Serial.begin(9600); 
  attachInterrupt(0, rpm_fan, FALLING);
 }
 void loop()
 {
  if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).
  detachInterrupt(0);//Disable interrupt when calculating
  rpm = half_revolutions * 30; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
  Serial.print("RPM =\t"); //print the word "RPM" and tab.
  Serial.print(rpm); // print the rpm value.
  Serial.print("\t Hz=\t"); //print the word "Hz".
  Serial.println(half_revolutions); //print revolutions per second or Hz. And print new line or enter.
  half_revolutions = 0; // Restart the RPM counter
  lastmillis = millis(); // Uptade lasmillis
  attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
  }
 }
 // this code will be executed every time the interrupt 0 (pin2) gets low.
 void rpm_fan(){
  half_revolutions++;
 }
// read RPM
 int pin3 = 3;
 int pin4 = 4;
 int pin5 = 5;
 int pin6 = 6;
 int pin7 = 7;
 int pin8 = 8;
 int pin9 = 9;
 int timer = 250;
 bool onetime = true;
 int half_revolutions = 0;
 int rpm = 2;
 unsigned long lastmillis = 0;
 void setup()
 {
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);  
  Serial.begin(9600); 
  attachInterrupt(0, rpm_fan, FALLING);
  digitalWrite(pin3, HIGH);
   delay(timer);

   digitalWrite(pin4, HIGH);
   delay(timer);
   
   digitalWrite(pin5, HIGH);
   delay(timer);

   digitalWrite(pin6, HIGH);
   delay(timer);

   digitalWrite(pin7, HIGH);
   delay(500);
 
   digitalWrite(pin7, LOW);
   delay(timer);

   digitalWrite(pin6, LOW);
   delay(timer);
 
   digitalWrite(pin5, LOW);
   delay(timer);
   
   digitalWrite(pin4, LOW);
   delay(timer);

   digitalWrite(pin3, LOW);
   delay(timer);
   
   digitalWrite(pin8, HIGH);
   delay(1000);
   digitalWrite(pin9, HIGH);
   delay(1000);
  
   digitalWrite(pin9, LOW);
   delay(1000);
   digitalWrite(pin8, LOW);
   delay(1000);
   while(true);
 }
 void loop()
 {
  if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).
  detachInterrupt(0);//Disable interrupt when calculating
  rpm = half_revolutions * 30; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
  Serial.print("RPM =\t"); //print the word "RPM" and tab.
  Serial.print(rpm); // print the rpm value.
  Serial.print("\t Hz=\t"); //print the word "Hz".
  Serial.println(half_revolutions); //print revolutions per second or Hz. And print new line or enter.
  half_revolutions = 0; // Restart the RPM counter
  lastmillis = millis(); // Uptade lasmillis
  attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
  }
 }
 // this code will be executed every time the interrupt 0 (pin2) gets low.
 void rpm_fan(){
  half_revolutions++;
 }

provato ad unire i due sketch in tutti modi ma niente, qualche consiglio?

// read RPM
 int rpm = 2;
 int pin3 = 3;
 int pin4 = 4;
 int pin5 = 5;
 int pin6 = 6;
 int pin7 = 7;
 int pin8 = 8;
 int pin9 = 9;
 int timer = 250;
 bool onetime = true;
 int half_revolutions = 0;
 unsigned long lastmillis = 0;
 void setup()
 {
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);  
  
  
  
  digitalWrite(pin3, HIGH);
   delay(timer);

   digitalWrite(pin4, HIGH);
   delay(timer);
   
   digitalWrite(pin5, HIGH);
   delay(timer);

   digitalWrite(pin6, HIGH);
   delay(timer);

   digitalWrite(pin7, HIGH);
   delay(500);
 
   digitalWrite(pin7, LOW);
   delay(timer);

   digitalWrite(pin6, LOW);
   delay(timer);
 
   digitalWrite(pin5, LOW);
   delay(timer);
   
   digitalWrite(pin4, LOW);
   delay(timer);

   digitalWrite(pin3, LOW);
   delay(timer);
   
   digitalWrite(pin8, HIGH);
   delay(1000);
   digitalWrite(pin9, HIGH);
   delay(1000);
  
   digitalWrite(pin9, LOW);
   delay(1000);
   digitalWrite(pin8, LOW);
   delay(1000);
   while(true);
   attachInterrupt(0, rpm_fan, FALLING);
   Serial.begin(9600);
 }
 void loop()
 {
  if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).
  detachInterrupt(0);//Disable interrupt when calculating
  rpm = half_revolutions * 30; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
  Serial.print("RPM =\t"); //print the word "RPM" and tab.
  Serial.print(rpm); // print the rpm value.
  Serial.print("\t Hz=\t"); //print the word "Hz".
  Serial.println(half_revolutions); //print revolutions per second or Hz. And print new line or enter.
  half_revolutions = 0; // Restart the RPM counter
  lastmillis = millis(); // Uptade lasmillis
  attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
  }
 }
 // this code will be executed every time the interrupt 0 (pin2) gets low.
 void rpm_fan(){
  half_revolutions++;
 }

ciao

matita_76:
qualche consiglio?

Si: cosa intendi per "...ma niente" dovresti almeno specificare cosa non funziona: non compila; non fa quello che ti aspetti ecc.

Altro consiglio: per "unire" 2 sketch dovresti sapere cosa fanno e come lo fanno.

Questo:

 bool onetime = true;

Cosa dovrebbe fare? :o :o :o

while(true);

Questo va proprio tolto: crea un loop infinito (almeno credo) che blocca tutto a parte gli interrupts, però il calcolo della velocità della ventola lo fai all'interno del loop.

Altro problema:

if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).

considerando che millis() quando arrivi qui vale almeno 6250 (se ho contato bene) la vedo dura che 6250 - 0 sia uguale a 1000.

Questo si risolve aggiungendo un

 lastmillis = millis();

alla fine del setup().

Ciao
pippo72

matita_76:
provato ad unire i due sketch in tutti modi ma niente, qualche consiglio?

Consiglio? Sì impara a programmare e poi scrivi lo sketch che fa quello che vuoi.

Come hai giá notato non puoi mescolare 2 sketch alla ceca ma devi scriferne uno che fa le cose che vuoi senza che una part blocca l' altra.

Ciao Uwe

Ok grazie mille PIPPO 72 questa parte penso di averla risolta in questo modo sembra che funzioni

// read RPM
 int rpm = 2;
 int pin3 = 3;
 int pin4 = 4;
 int pin5 = 5;
 int pin6 = 6;
 int pin7 = 7;
 int pin8 = 8;
 int pin9 = 9;
 int timer = 250;
 bool onetime = true;
 int half_revolutions = 0;
 unsigned long lastmillis = 0;
 void setup()
 {
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);  
  
  
  
  digitalWrite(pin3, HIGH);
   delay(timer);

   digitalWrite(pin4, HIGH);
   delay(timer);
   
   digitalWrite(pin5, HIGH);
   delay(timer);

   digitalWrite(pin6, HIGH);
   delay(timer);

   digitalWrite(pin7, HIGH);
   delay(500);
 
   digitalWrite(pin7, LOW);
   delay(timer);

   digitalWrite(pin6, LOW);
   delay(timer);
 
   digitalWrite(pin5, LOW);
   delay(timer);
   
   digitalWrite(pin4, LOW);
   delay(timer);

   digitalWrite(pin3, LOW);
   delay(timer);
   
   digitalWrite(pin8, HIGH);
   delay(1000);
   digitalWrite(pin9, HIGH);
   delay(1000);
  
   digitalWrite(pin9, LOW);
   delay(1000);
   digitalWrite(pin8, LOW);
   delay(1000);
   
   attachInterrupt(0, rpm_fan, FALLING);
   Serial.begin(9600);
   lastmillis = millis();
 }
 void loop()
 {
  if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).
  detachInterrupt(0);//Disable interrupt when calculating
  rpm = half_revolutions * 30; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
  Serial.print("RPM =\t"); //print the word "RPM" and tab.
  Serial.print(rpm); // print the rpm value.
  Serial.print("\t Hz=\t"); //print the word "Hz".
  Serial.println(half_revolutions); //print revolutions per second or Hz. And print new line or enter.
  half_revolutions = 0; // Restart the RPM counter
  lastmillis = millis(); // Uptade lasmillis
  attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
  }
 }
 // this code will be executed every time the interrupt 0 (pin2) gets low.
 void rpm_fan(){
  half_revolutions++;
 }

matita_76:
...questa parte penso di averla risolta in questo modo sembra che funzioni

Se dovessi "aggiungere" altro al tuo sketch ti consiglio di guardare bene questa riga di codice:

 if (millis() - lastmillis == 1000)

c'è qualcosa che potrebbe darti noie.... ma non ti dico cosa. :wink:

ciao
pippo72

sicuramente adesso vorrei aggiungere nello sketch l'accensione di un po di led ad un certo numero di giri sto spulciando vari sketch per vedere quale risponde meglio alle mie esigenze