Unione Sketch

Ciao a tutti! Ho realizzato questo sketch:

int ledPin1 = 6;
int ledPin2 = 9;
int ledPin3 = 10;
int ledPin4 = 11;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
}

void loop() {
  
  digitalWrite (ledPin1, HIGH);
  digitalWrite (ledPin2, HIGH);
  digitalWrite (ledPin3, HIGH);
  digitalWrite (ledPin4, HIGH);
  delay (5000);
  digitalWrite (ledPin1, LOW);
  digitalWrite (ledPin2, LOW);
  digitalWrite (ledPin3, LOW);
  digitalWrite (ledPin4, LOW);
  delay (5000);
}

come faccio ad unirci quest'altro in modo che funzionino separatamente e indipendentemente?

#include <Servo.h> 

Servo Servo1; 
void setup() {
  Servo1.attach (9); 
}

void loop() {
  Servo1.write (-180);  
  delay (500);
  Servo1.write (180);
  delay (500);
}

Grazie!

Ciao, non è chiaro cosa intendi quando dici di unirli e che lavorino in modo indipendente ??

1)Vuoi, ad esempio, che i due codici lavorino contemporaneamente e ognuno esegua il suo compito?
Per far questo dovresti inserire i codici dei due programmi nella funzione setup() e nella funzione loop(),
ma visto che usi dei delay(), il ritardo che si genera "si farà sentire" su tutti e due i programmi, magari pensare di usare un sistema con millis().

  1. Se invece vuoi inserire i due programmi e selezionare, scegliere se eseguire uno o l'altro, allora ti serve un selettore "ad esempio un pulsante che cambia il valore di una variabile stato", e ti crei due diverse funzioni da richiamare nel loop(), una funzione conterrà il codice del primo programma, la seconda quello del secondo programma, in questo modo selezioni e richiami dal loop() il programma che vuoi eseguire...

Hai postato un solo sketch.

torn24:
Hai postato un solo sketch.

In realtà aveva fatto due thread separati ... ora li ho riuniti e quindi, in alto, si trovano i due codici.

Guglielmo

Adesso che gpb01 ha completato la domanda, questa sembra più chiara.
Da quello che penso, vuoi fare lampeggiare i led e al contempo muovere il servo.

Penso che ti servano due macchini a stati finiti, cioè una variabile stato che passa da 1 a 0 ogni 5 secondi,per i led, e una variabile stato2 che passa da 1 a 0 ogni mezzo secondo per i servo.

E poi programmare i compiti con millis().

Ti posto un link che spiega come programmare i compiti con millis(), tu invece di eseguire istruzioni con millis() dovrai invertire lo stato delle variabili, se stato==1 allora stato=0, else stato=1

http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

torn24:
Ciao, non è chiaro cosa intendi quando dici di unirli e che lavorino in modo indipendente ??

1)Vuoi, ad esempio, che i due codici lavorino contemporaneamente e ognuno esegua il suo compito?
Per far questo dovresti inserire i codici dei due programmi nella funzione setup() e nella funzione loop(),
ma visto che usi dei delay(), il ritardo che si genera "si farà sentire" su tutti e due i programmi, magari pensare di usare un sistema con millis().

  1. Se invece vuoi inserire i due programmi e selezionare, scegliere se eseguire uno o l'altro, allora ti serve un selettore "ad esempio un pulsante che cambia il valore di una variabile stato", e ti crei due diverse funzioni da richiamare nel loop(), una funzione conterrà il codice del primo programma, la seconda quello del secondo programma, in questo modo selezioni e richiami dal loop() il programma che vuoi eseguire...

Hai postato un solo sketch.

vorrei fare la prima opzione. i led funzionano separatamente dal servo ma nello stesso programma.

torn24:
Adesso che gpb01 ha completato la domanda, questa sembra più chiara.
Da quello che penso, vuoi fare lampeggiare i led e al contempo muovere il servo.

Penso che ti servano due macchini a stati finiti, cioè una variabile stato che passa da 1 a 0 ogni 5 secondi,per i led, e una variabile stato2 che passa da 1 a 0 ogni mezzo secondo per i servo.

E poi programmare i compiti con millis().

Ti posto un link che spiega come programmare i compiti con millis(), tu invece di eseguire istruzioni con millis() dovrai invertire lo stato delle variabili, se stato==1 allora stato=0, else stato=1

http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

Forse mi sto avvicinando. Ho scritto questo sketch grazie al link che mi hai dato, ma ho ancora alcuni problemi.

  1. Non riesco a variare la durata del lampeggio dei led
  2. Come faccio a fare in modo che il servo si fermi per un certo tempo dopo aver compiuto i 180°? ( massima rotazione)
#include <Servo.h>

Servo myservo;
int pos = 0;
unsigned long previousMillis = 0;
long interval = 15;

const int ledPin1 = 6;
const int ledPin2 = 9;
const int ledPin3 = 10;
const int ledPin4 = 11;

int ledState = 0;
 
unsigned long previousMillis1 = 0; 
unsigned long interval1 = 0; 

void setup() {
  
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  myservo.attach (5);
}

void loop() {
  
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis1 > interval1) {
    previousMillis1 = currentMillis; 
    ledState ^= 1;
    
    digitalWrite(ledPin1, ledState);
    digitalWrite(ledPin2, ledState);
    digitalWrite(ledPin3, ledState);
    digitalWrite(ledPin4, ledState);

    unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval){
  previousMillis = currentMillis;
  
  
  for(pos = 0; pos < 180; pos += 1)   
  {                                  
    myservo.write(pos);               
    delay(20);                      
  } 
  for(pos = 180; pos>=1; pos-=1)     
  {                                
    myservo.write(pos);              
    delay(20);               
    
  }
}
  }
}
  [code]

Ciao, hai già intrapreso la strada giusta per risolvere il problema, ma...

  1. Devi usare un millis() per gestire i led e un altro per gestire i servo, e non come hai fatto tu
    uno dentro l'altro, altrimenti non sono indipendenti ma uno somma la pausa dell'altro.

2)Due per gestire i servo usare un sistema diverso che non prevede cicli for o while, in un ciclo
si può mettere in pausa solo con delay() e noi non vogliamo fare pause che blocchino il programma

Qui ti posto un esempio commentato, non ho provato perché non ho nessuna voglia di fare il circuito.
Se non capisci alcune soluzioni, chiedi pure e proverò a spiegarti, ma non so se posso essere più chiaro
che i commenti che ho messo :slight_smile:

#include <Servo.h>

Servo myservo;
int pos = 0;
int statoMotore=1;
unsigned long previousMillis = 0;
unsigned long interval = 15;// Varial la velocità del servo

const int ledPin1 = 6;
const int ledPin2 = 9;
const int ledPin3 = 10;
const int ledPin4 = 11;

int ledState = 0;
 
unsigned long previousMillis1 = 0; 
unsigned long interval1 = 2000; // Varia la frequenza lampeggio led

void setup() {
  
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  myservo.attach (5);
}

void loop() {
  
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis1 > interval1) {
      previousMillis1 = currentMillis; 
      ledState ^= 1;
    
      digitalWrite(ledPin1, ledState);
      digitalWrite(ledPin2, ledState);
      digitalWrite(ledPin3, ledState);
      digitalWrite(ledPin4, ledState);

      currentMillis = millis(); //Devi usare la stessa variabile e non dichiararne una nuova niente unsigned long
  } // Fine millis() per gestione led
 if(currentMillis - previousMillis > interval){//interval è la pausa che fai ad ogni movimento
    previousMillis = currentMillis;
	/*Se statoMotore è uguale a uno il servo va in direzione positiva
	  se statoMotore è uguale a zero il servo va in direzione negativa*/
	if(statoMotore==1)
        myservo.write(pos++);
    else
		myservo.write(pos--);
	
	/*****************************/
    if(pos>180)
		statoMotore=0;
	else if(pos<0)
		statoMotore=1;
}
  
}//fine loop
  [code]

Se è utile un punto di karma è gradito...

torn24:
Ciao, hai già intrapreso la strada giusta per risolvere il problema, ma...

  1. Devi usare un millis() per gestire i led e un altro per gestire i servo, e non come hai fatto tu
    uno dentro l'altro, altrimenti non sono indipendenti ma uno somma la pausa dell'altro.

2)Due per gestire i servo usare un sistema diverso che non prevede cicli for o while, in un ciclo
si può mettere in pausa solo con delay() e noi non vogliamo fare pause che blocchino il programma

Qui ti posto un esempio commentato, non ho provato perché non ho nessuna voglia di fare il circuito.
Se non capisci alcune soluzioni, chiedi pure e proverò a spiegarti, ma non so se posso essere più chiaro
che i commenti che ho messo :slight_smile:

#include <Servo.h>

Servo myservo;
int pos = 0;
int statoMotore=1;
unsigned long previousMillis = 0;
unsigned long interval = 15;// Varial la velocità del servo

const int ledPin1 = 6;
const int ledPin2 = 9;
const int ledPin3 = 10;
const int ledPin4 = 11;

int ledState = 0;

unsigned long previousMillis1 = 0;
unsigned long interval1 = 2000; // Varia la frequenza lampeggio led

void setup() {
 
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  myservo.attach (5);
}

void loop() {
 
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis1 > interval1) {
      previousMillis1 = currentMillis;
      ledState ^= 1;
   
      digitalWrite(ledPin1, ledState);
      digitalWrite(ledPin2, ledState);
      digitalWrite(ledPin3, ledState);
      digitalWrite(ledPin4, ledState);

currentMillis = millis(); //Devi usare la stessa variabile e non dichiararne una nuova niente unsigned long
  } // Fine millis() per gestione led
if(currentMillis - previousMillis > interval){//interval è la pausa che fai ad ogni movimento
    previousMillis = currentMillis;
/Se statoMotore è uguale a uno il servo va in direzione positiva
  se statoMotore è uguale a zero il servo va in direzione negativa
/
if(statoMotore==1)
        myservo.write(pos++);
    else
myservo.write(pos--);

/*****************************/

if(pos>180)
statoMotore=0;
else if(pos<0)
statoMotore=1;
}
 
}//fine loop
  [code]





Se è utile un punto di karma è gradito...

Grazie, davvero molto utile. Non credo ancora di aver capito come mettere in pausa il servo senza usare delay() (sono un po' inesperto). Potresti spiegarmelo? Grazie ancora!

Rick_Findus:
Non credo ancora di aver capito come mettere in pausa il servo senza usare delay() (sono un po' inesperto). Potresti spiegarmelo?

Devi studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo