Unire due codici

Ciao a tutti , ho iniziato un progetto con arduino unoR3 per il funzionamento dell'apertura di una piccola tramoggia tramite un servo motore.
Questa è la parte del codice per ils ervo che ho modificato

#include <Servo.h> 

Servo Servo1; 

void setup() {
  Servo1.attach (6); 
}

void loop() {
  Servo1.write (-180);  
  delay (500);
  Servo1.write (-150);
  delay (500);
  Servo1.write (-120);
  delay (500);
  Servo1.write (-90);
  delay (500);
  Servo1.write (-60);
  delay (500);
  Servo1.write (-30);
  delay (500);
  Servo1.write (0);
  delay (500);
  Servo1.write (30);
  delay (500);
  Servo1.write (60);
  delay (500);
  Servo1.write (90);
  delay (500);
  Servo1.write (120);
  delay (500);
  Servo1.write (150);
  delay (500);
  Servo1.write (180);
  delay (500);
}

Ora il primo problema ,come faccio a dire al servo terminato il ciclo e riposizionato a 180 gradi di fermarsi li e rimanere fermo ?
Per come l'ho compilato continua a girare sempre.
Poi se era possibili volevo far attivare questa parte di codice a orari deefiniti.
Hoc ercato tra i vari manuali e ho trovato questa soluzione:

//includo la libreria time e TimeAlarms
#include <Time.h>
#include <TimeAlarms.h>

void setup() {
  //init Seriale
  Serial.begin(9600);
  delay(100);

  pinMode(13, OUTPUT);

  //imposto l'ora e la data
  //ora 15:29:30
  //data 08/04/2015
  setTime(15,29,30,8,4,2015);

  //creo
  Alarm.alarmRepeat(15,30,0, ledBlink);
}

void loop() {
  //visualizza l'ora corrente
  Serial.print("Tempo= ");
  Serial.print(hour());
  Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
  Serial.print(second());
  Serial.println("");

  //esegui ogni secondo
  //e richiama la funzione Alarm
  Alarm.delay(1000);
}

void ledBlink()
{
  //blinka il led onboard
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}

Tramite un modulo Real Time Clock RTC DS3231 imposto l'ora ma quando cerco di unire i codici alla compilazione escono fuori una miriade di errori.

E' fattibile come progetto secondo voi ?
Grazie in anticipo :slight_smile:
Mauro

Quello che vuoi fare è anche abbastanza semplice

Servono però alcune cose che all'inizio ti saranno ostiche

Per la parte di unire due programmi separati
Serve di realizzare programmi non bloccanti
E
Serve di pensare i due "programmi" come due differenti funzioni non bloccanti di un unico programma
E quindi
Serve di risolvere tutte le definizioni doppie di seriali, piedini, variabili e similia

Per la parte "programmi non bloccanti" serve di pensare al programma come macchina a stati finiti
E
Eliminare i delay()
Guardando magari
"Blink without delay"
"Il tempo delle librerie"
"Passo passo a passo nel tempo"

Inoltre credo molto utile leggere bene il regolamento
E anche
"Aiutateci ad aiutarvi"
"La pappa è fatta"
"Aiutati che il ciel ti aiuta"

1 Like

Ma da solo questo ti compila ??

1 Like

Ciao, certo che è possibile.
Cerca di aderire a due programmi devi seguire alcune regole elementari:

  • Scegli il programma principale. in questo caso è senza dubbio il secondo da quando il tempo scorre e quando arriva l'allarme si attiva il led sulla nostra scheda e si attiva il servo.
  • Aggiungere a ciò che è prima della messa a punto {} del programma principale ciò che abbiamo prima della messa a punto {} del programma servo. evitando sempre di duplicare librerie, dichiarazioni, variabili, unificando queste ultime se fanno lo stesso, ecc.
  • Aggiungere nel setup {} del programma principale il setup {} del secondo con le stesse precauzioni del punto precedente, duplicare le definizioni dei pin, che un pin serve a due cose, (sarebbe necessario aggiungerne uno nuovo) , eccetera.
  • E infine integrare quello che vogliamo che il secondo programma faccia in quello che fa il principale, questo è difficile, devi avere le cose chiare e un po 'di pratica, ma in sintesi è avere le considerazioni precedenti e mettere tutto al suo posto.

Vediamo nel tuo caso. Facciamo i punti uno e due. E faremo il terzo, vediamo che fondamentalmente il secondo programma è un orologio che quando arriva l'ora della sveglia:
Alarm.alarmRepeat (15,30,0, ledBlink);
Richiama la funzione ledBlink, definita successivamente, e fa lampeggiare il led della scheda. Bene, l'abbiamo già in quella funzione, ho messo il movimento del servo ed è già risolto. Solo il servo si muove quando suona l'allarme.
Notate come utilizzo due cicli FOR per evitare di scrivere così tanto codice, facendolo come farebbe la vostra funzione.
Il nuovo codice sarebbe simile a questo:

// includo la libreria servo
#include <Servo.h>
Servo Servo1;

//includo la libreria time e TimeAlarms
#include <Time.h>
#include <TimeAlarms.h>

void setup() {
  //init servo
  Servo1.attach (6);
  //init Seriale
  Serial.begin(9600);
  delay(100);
  pinMode(13, OUTPUT);

  //imposto l'ora e la data
  //ora 15:29:30
  //data 08/04/2015
  setTime(15, 29, 30, 8, 4, 2015);

  //creo
  Alarm.alarmRepeat(15, 30, 0, ledBlink);
}

void loop() {
  //visualizza l'ora corrente
  Serial.print("Tempo= ");
  Serial.print(hour());
  Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
  Serial.print(second());
  Serial.println("");

  //esegui ogni secondo
  //e richiama la funzione Alarm
  Alarm.delay(1000);
}

void ledBlink()
{
  //blinka il led onboard
  for (int y=0; y<3; y++){
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
  }
  // Muovo il servo 
  for (int x= -180; x<=80; x=x+30){
  Servo1.write (-180);
  delay (500);
  }  
}
// Ho testato il programma si compila e funziona bene 

Saluti.

1 Like

Giusto per saperlo, pura curiosità

Qual è la tua lingua madre? Castigliano?

1 Like

Sì, e un piccolo aiuto da Google

1 Like

Grazie mille sei stato gentilissimo, almeno ho le basi per partire e capire :slight_smile: purtroppo sono troppo abituato ai sistemi di programmazione dei plc tipo siemens e schneider electric e imparare un linguaggio cosi subito non è facile, cmq mi devo procurare un buon manuale che spieghi bene le funzioni base e fare tanti esperimenti.
Grazie ancora tantissimo per l'aiuto :slight_smile:

sypher77, ti ricordo solo che Arduino si programma in linguaggio C/C++, poi si usa un core specifico, ovvero una serie di librerie "Arduiniane" e comandi specifici ma di base è linguaggio C.
Infatti un programma Arduino nasconde (il core/framework) che c'e' sempre un classico main() del linguaggio C ed è all'incirca:

main()
{ setup()
  while(1) loop();
}

Quindi, leggi un buon manuale di C

1 Like

Grazie mille per il consiglio :slight_smile: