Go Down

Topic: Unire due sketch (Read 1 time) previous topic - next topic

jack096

Ciao, è la prima volta che scrivo, lo faccio perchè mi trovo in difficolta, ho fatto un circuito con una scheda relè che comanda una striscia led, fin qui tutto bene.
il primo sketch fa in modo che alla pressione di un pulsante inverta lo stato del relè, mentre il secondo mi permette di controllare il relè tramite il monitor seriale, premendo h(HIGH) si attiva, mentre con l(LOW) si disattiva. come posso fare ad unire i due sketch e avere le funzioni di entrambi nello stesso programma? Grazie per le risposte.

primo sketch
Code: [Select]
#define relay 12 
#define pulsante 7   
int val = 0; 
int vecchio_val = 0;
int stato = 0;   
void setup() {               
  pinMode(relay, OUTPUT);       
  pinMode(pulsante, INPUT);
  }

void loop() {
  val = digitalRead(pulsante);  // legge il valore dell'input e lo conserva

  // controlla se è accaduto qualcosa
  if ((val == HIGH) && (vecchio_val == LOW)){
    stato = 1 - stato;
    delay(15);                // attesa di 15 millisecondi
  }

  vecchio_val = val;            // ricordiamo il valore precedente di val

    if (stato == 1) {
    digitalWrite(relay, HIGH);   // accende il led
  }
  else {
    digitalWrite(relay, LOW);    //spegne il led
  }
}


secondo sketch
Code: [Select]

int relay=12;
int incomingByte; 

void setup()
{
  pinMode(relay, OUTPUT);
  Serial.begin(9600);
 
}

void loop()
{
  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
  if (incomingByte == 'h') {
  digitalWrite(relay, HIGH);
  }
    if (incomingByte == 'l') {
     digitalWrite(relay, LOW);
    }
  }
  }
 

leo72

Dì la verità, c'è il trabocchetto, vero?   ;)

BTW, devi inserire le 2 porzioni di codice nel loop di un unico sketch. Per comodità potresti racchiudere il codice del loop del primo sketch in una funzione e quello del loop del secondo in un'altra e poi richiamare entrambe dal loop() del nuovo sketch.
Esempio:

void loop() {
  funzione1();
  funzione2();
}

void funzione1() {
...
}

void funzione2() {
...
}

Le variabili globali le metti tutte in cima, controllando che non ci siano doppioni.
Le configurazioni da fare nei vari setup le riunisci in uno.

jack096

dovrebbe venire così giusto? perchè con il pulsante funziona, con il monitor seriale solo quando vuole lui..
Code: [Select]
#define pulsante 7   
int val = 0; 
int vecchio_val = 0;
int stato = 0;   
int relay=12;
int incomingByte; 

void setup() {               
pinMode(relay, OUTPUT);       
pinMode(pulsante, INPUT);
Serial.begin(9600);
  }
 
void loop() {
  funzione1();
  funzione2();
}

void funzione1()  {
val = digitalRead(pulsante);  // legge il valore dell'input e lo conserva

  // controlla se è accaduto qualcosa
  if ((val == HIGH) && (vecchio_val == LOW)){
    stato = 1 - stato;
    delay(15);                // attesa di 15 millisecondi
  }

  vecchio_val = val;            // ricordiamo il valore precedente di val

    if (stato == 1) {
    digitalWrite(relay, HIGH);   // accende il led
  }
  else {
    digitalWrite(relay, LOW);    //spegne il led
  }
}


void funzione2() {
{
  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
  if (incomingByte == 'h') {
  digitalWrite(relay, HIGH);
  }
    if (incomingByte == 'l') {
     digitalWrite(relay, LOW);
    }
  }
}
}

leo72

Che vuol dire "solo quando vuole lui"?

jack096

eh.. ogni tanto si ogni tanto no, non ne capisco il motivo..

leo72

1) immi, devo accendere la sfera di cristallo oppure spieghi meglio cos'è che non va?  ;)
Se ti chiedo cosa c'è che non va, non mi puoi rispondere che il programma che "ogni tanto si ogni tanto no"

2) questo "ogni tanto si ogni tanto no" lo faceva anche prima dell'unione o solo ora?  :smiley-sweat:

Brunello

prova a riscrivere la funzione1()

Code: [Select]
void funzione1()  {
val = digitalRead(pulsante);  // legge il valore dell'input e lo conserva

  // controlla se è accaduto qualcosa
  if (val != vecchio_val) {
    if (val == LOW) {
    digitalWrite(relay, LOW);    //spegne il led
}
else {
 
    digitalWrite(relay, HIGH);   // accende il led
}
}
vecchio_val = val;            // ricordiamo il valore precedente di val
delay(15);
}

jack096

la funzione1 va bene, con il pulsante funziona sempre, il problema è nella funzione2, che, da sola funzionava, ma adesso combinata non capisco perchè ma funziona solo ogni tanto, ad esempio se il pin12 è disattivato, apro il monitor seriale, e appena si apre scrivo "h" e premo invio si attiva il pin, ma facendolo quando è acceso il pin e premendo "l" no, non so a cosa sia dovuto..

leo72

Faccio caso ora ad una cosa, piloti il pin da entrambe le funzioni.
Forse è per questo che ti si incarta il programma. Non ho analizzato il codice che hai scritto ma la logica quale dovrebbe essere?
Vorresti attivare un pin all'arrivo di un comando sulla seriale e spengerlo all'arrivo di un altro?

Se è solo questo, allora potresti fare tutto in un un unico blocco di codice.

Brunello

devi cambiare il valore della variabile 'stato' anche nella funzione 2

altrimenti appena il loop ritorna sulla funzione1, ti rimette il led come stava

e siccome il tutto e' molto rapido....

jack096


Faccio caso ora ad una cosa, piloti il pin da entrambe le funzioni.
Forse è per questo che ti si incarta il programma. Non ho analizzato il codice che hai scritto ma la logica quale dovrebbe essere?
Vorresti attivare un pin all'arrivo di un comando sulla seriale e spengerlo all'arrivo di un altro?

Se è solo questo, allora potresti fare tutto in un un unico blocco di codice.

si esatto, vorrei poterlo accendere da uno e spegnerlo dall'altro e viceversa, solo che la funzione 2 non funziona nemmeno singolarmente nello sketch a due funzioni, mentre la prima si, ho provato anche a cambiare di ordine la 1 con la 2, ma rimane uguale..

Go Up