salve ho necessita di accendere un led con funzioni lampeggio diverse a seconda della situazione usando un contatore. Sto modificando un esempio trovato sui forum ma non riesco a fare il cambio di gioco, qualcuno mi puo aiutare? se carico un solo gioco alla volta tutto ok, se entrambi il secondo non funziona mai
[code]
// GIOCHI LED CON DISPLAY TM1632
// ******************** **********************
#define led 6 //led attaccato al pin 6
int intervallo_led = 1000;
unsigned long tempo_led;
byte ciclo_led = 0;
int intervallo_ledd = 1000;
unsigned long tempo_ledd;
byte ciclo_ledd = 0;
/**************** IMPOSTAZIONE DISPLAY *****************/
#include "TM1637.h"
#define DIO 2
#define CLK 3
TM1637 tm1637(CLK,DIO);
int countgiochi = 0;
void setup() {
Serial.begin (9600);
tm1637.init();
tm1637.set (BRIGHT_TYPICAL);
pinMode(4, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP); // reset pulsante di reset display
pinMode(led,OUTPUT); // imposto pin 6 come uscita
}
int giochi, prevgiochi;
void loop() {
shownumber (countgiochi); //questo serve per accendere il display
int giochi = digitalRead(4);
if (!giochi && prevgiochi ){
countgiochi++;
delay (150);
}
if (digitalRead (13)) //qui resetto il contatore
{
countgiochi = 0;
}
prevgiochi = giochi; // contagiochi
}
void shownumber(int n){
int d1 = n % 10; // qui prendo il numero del modulo e trovo le unita
int d2 = (n/10) % 10; // qui prendo il numero del modulo e trovo le decine
int d3 = (n/100) % 10; // qui prendo il numero del modulo e trovo le centinaia
int d4 = (n/1000) % 10; // qui prendo il numero del modulo e trovo le migliaia
tm1637.display(0,d4); // migliaia
tm1637.display(1,d3); // centinaia
tm1637.display(2,d2); // decine
tm1637.display(3,d1); // unita e quindi numero + a destra
/**************************************************************************/
/**** * GIOCO 1 *****/
/**************************************************************************/
if ( countgiochi >=1 && countgiochi <=5 )
if (millis() - tempo_led >= intervallo_led)
{
play_led();
if (ciclo_led < 5) ++ ciclo_led; else ciclo_led = 0;
tempo_led = millis();
}
}
void play_led() {
switch (ciclo_led) {
case 0: // il led e spento
digitalWrite(led, LOW);
break;
case 1:
digitalWrite(led, HIGH); //lo accendo per 30 millis
intervallo_led = 30;
break;
case 4:
digitalWrite(led, LOW); // lo spengo per 1 secondo
intervallo_led = 1000; //e riparte il ciclo tenendo conto anche del ritardo play_led,
break;
}
/**************************************************************************/
/**** * GIOCO 2 *****/
/**************************************************************************/
if ( countgiochi >=6 && countgiochi <=10 )
if (millis() - tempo_ledd >= intervallo_ledd)
{
play_ledd();
if (ciclo_ledd < 5) ++ ciclo_ledd; else ciclo_ledd = 0;
tempo_ledd = millis();
}
}
void play_ledd() {
switch (ciclo_ledd) {
case 0: // il led è spento
digitalWrite(led, LOW);
break;
case 1:
digitalWrite(led, HIGH); //lo accendo per 120 millis
intervallo_ledd = 120;
break;
case 2:
digitalWrite(led, LOW); //lo spengo
break;
case 3:
digitalWrite(led, HIGH); // lo accendo per 30 millis
intervallo_ledd = 30;
break;
case 4:
digitalWrite(led, LOW); // lo spengo per 1 secondo
intervallo_ledd = 1000; //e riparte il ciclo tenendo conto anche del ritardo play_led,
break;
}
}
[/code]
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.
Io non sono un programmatore, pero' non capisco come possano funzionare quegli if di countgiochi ... ad esempio ...
Questo dovrebbe significare (se non sbaglio), che l'if e' eseguito se countgiochi e' "maggiore o uguale ad 1" e contemporaneamente "minore o uguale a 5" ... salvo che il compilatore non si prenda cura lui della cosa, come potrebbe essere contemporaneamente uguale ad 1 e a 5 ? (oppure mi sfugge qualcosa a causa del troppo spumante )
E poi, in gioco 1, dove sono finiti i case 2 e 3 ? ... ok, vengono ignorati, ma viene comunque eseguito il ritardo dell'ultimo tempo_led impostato, e' intenzionale ?
... significa che la if è verificata per countgiochi compreso tra 1 e 5 ovvero un qualsiasi numero maggiore e uguale ad uno, ma minore o uguale a cinque
anche io non conosco arduino e ogni cosa che faccio cerco di studiarmelo
inizialmente avevo messo dei delay che pero bloccavano il sw poi ho temporizzato con dei millis ma come ho già detto non riesco a far funzionare le due sequenze
in realta contagiochi non sarebbe il nome più opportuno il contagiochi è nato con il solo gioco 2
adesso ho necessità di contare dei pezzi: se sono compresi in un certo quantitativo lampeggio lento se in un secondo quantitativo lampeggio un po più veloce se supero un terzo quantitativo led fisso( questa parte la aggiungo quando funzionano i primi due)
grazie gbp della segnalazione se devo dirti sinceramente non so come capire se sono nulla sezione in lingua inglese; mi sono collegato al forum, leggevo tutto in italiano e ho creato una nuova discussione
... hai probabilmente la trduzione automatica delle pagine impostata nel browser ... questo qui ti creerà problemi e, continuando a sbagliare, potrebbe anche portare alla sospensione dell'account, quindi ... disattiva la traduzione automatica
Richiami play_ledd dentro play_led. E richiami play_led dentro l'if (compreso tra 1 e 5).
Quindi l'if (copreso tra 6 e 10) dentro play_led non sarà mai vero.
Mi pare un po' macchinoso.
Ti bastano 2 lampeggi diversi o ti serve per forza con quella logica?
ho provato a capire cosa intendi ma non funziona niente
sembrava facile: se sono compreso tra 1 e 5 ottengo un lampeggio, se 6 e 10 2 lampeggi
quando conto fra 6 e 10 la condizione 1 e 5 risulta falsa quindi non capisco perchè non funziona
come dicevo prima le funzioni play_led e play_ledd caricate separatamente funzionano
Sono sbagliate le parentesi delle strutture if, quindi il programma fa tutt'altro da quello che ti aspetti. Prova a incolonnare le parentesi aperte con quelle chiuse e gli errori si riveleranno immediatamente
Prendi il tuo codice, dallo in pasto all'IDE di Arduino ed usa l'apposito strumento di formattazione del codice ... Tools -> Auto Format ... ti sistemerà tutte le varie indentature e ... potrai facilmente scoprire se ti è scappata qualche parentesi graffa in qualche if (vedrai indentature non corrette) ...
Chi ti ha detto di ricompilare? Claudio_FF ti ha detto di LEGGERE attentamente il codice indentato per scoprire, grazie proprio alle indentature, degli IF male aperti/chiusi che ... fanno fare al programma cose diverse da quelle che ti aspetti.
Considera che basta, ad esempio, digitare un ';' di troppo per avere effetti completamente diversi
... esempio:
ecco, le istruzioni tra le graffe verranno eseguire sempre, indipendentemnete dalla condizione, causa il ';' di troppo.
Similmente, graffe mal poste o proprio omesse, cambiano tutta la logica del programma che però, se ci sono tutte, comunque non danno errori di compilazione.
// GIOCHI LED CON DISPLAY TM1632
// ******************** **********************
#define led 6 //led attaccato al pin 6
int intervallo_led = 1000;
unsigned long tempo_led;
byte ciclo_led = 0;
int intervallo_ledd = 1000;
unsigned long tempo_ledd;
byte ciclo_ledd = 0;
/**************** IMPOSTAZIONE DISPLAY *****************/
#include "TM1637.h"
#define DIO 2
#define CLK 3
TM1637 tm1637(CLK, DIO);
int countgiochi = 0;
void setup() {
Serial.begin (9600);
tm1637.init();
tm1637.set (BRIGHT_TYPICAL);
pinMode(4, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP); // reset pulsante di reset display
pinMode(led, OUTPUT); // imposto pin 6 come uscita
}
int giochi, prevgiochi;
void loop() {
shownumber (countgiochi); //questo serve per accendere il display
int giochi = digitalRead(4);
if (!giochi && prevgiochi ) {
countgiochi++;
delay (150);
}
if (digitalRead (13)) //qui resetto il contatore
{
countgiochi = 0;
}
prevgiochi = giochi; // contagiochi
}
void shownumber(int n) {
int d1 = n % 10; // qui prendo il numero del modulo e trovo le unita
int d2 = (n / 10) % 10; // qui prendo il numero del modulo e trovo le decine
int d3 = (n / 100) % 10; // qui prendo il numero del modulo e trovo le centinaia
int d4 = (n / 1000) % 10; // qui prendo il numero del modulo e trovo le migliaia
tm1637.display(0, d4); // migliaia
tm1637.display(1, d3); // centinaia
tm1637.display(2, d2); // decine
tm1637.display(3, d1); // unita e quindi numero + a destra
if ( countgiochi >= 1 && countgiochi <= 5)
if ( millis() - tempo_led >= intervallo_led)
{
play_led();
if ( ciclo_led < 3) ++ ciclo_led; else ciclo_led = 0;
tempo_led = millis();
}
if ( countgiochi >= 6 && countgiochi <= 10 )
if ( millis() - tempo_ledd >= intervallo_ledd)
{
play_ledd();
if (ciclo_ledd < 5) ++ ciclo_ledd; else ciclo_ledd = 0;
tempo_ledd = millis();
}
}
/**************************************************************************/
/**** * GIOCO 1 *****/
/**************************************************************************/
void play_led() {
switch (ciclo_led) {
case 0: // il led e spento
digitalWrite(led, LOW);
break;
case 1:
digitalWrite(led, HIGH); //lo accendo per 20 millis
intervallo_led = 20;
break;
case 2:
digitalWrite(led, LOW); // lo spengo per 1 secondo
intervallo_led = 2000; //e riparte il ciclo tenendo conto anche del ritardo play_led,
break;
}
}
/**************************************************************************/
/**** * GIOCO 2 *****/
/**************************************************************************/
void play_ledd() {
switch (ciclo_ledd) {
case 0: // il led è spento
digitalWrite(led, LOW);
break;
case 1:
digitalWrite(led, HIGH); //lo accendo per 120 millis
intervallo_ledd = 120;
break;
case 2:
digitalWrite(led, LOW); //lo spengo
break;
case 3:
digitalWrite(led, HIGH); // lo accendo per 30 millis
intervallo_ledd = 30;
break;
case 4:
digitalWrite(led, LOW); // lo spengo per 1 secondo
intervallo_ledd = 2000; //e riparte il ciclo tenendo conto anche del ritardo play_led,
break;
}
}