Pages: [1]   Go Down
Author Topic: Unire due sketch  (Read 718 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
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);
    }
  }
  }
 
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dì la verità, c'è il trabocchetto, vero?   smiley-wink

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dovrebbe venire così giusto? perchè con il pulsante funziona, con il monitor seriale solo quando vuole lui..
Code:
#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);
    }
  }
}
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Che vuol dire "solo quando vuole lui"?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

1) immi, devo accendere la sfera di cristallo oppure spieghi meglio cos'è che non va?  smiley-wink
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
Logged


Tuscany
Offline Offline
Edison Member
*
Karma: 37
Posts: 1479
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prova a riscrivere la funzione1()

Code:
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);
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Tuscany
Offline Offline
Edison Member
*
Karma: 37
Posts: 1479
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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....
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Pages: [1]   Go Up
Jump to: