[Risolto] 2 button 2 Led

Salve vorrai inserire 2 bUTTON per eseguire lo stesso codice.

parte con led11 led12 HIGH PER 2 ORE SE BUTTON 1 HIGHt --> LED11 HIGH 12 lOW finché button 2 diventa Hight attesa 2 ore se button 2 high ----> led11 LOW 12 HIGH fine button1 diventa hight attesa 2 ore rifare il ciclo

in teoria devo inserire solo 2 fine corsa GRazie

  #define LED 11  
    #define LED 12  
  // LED collegato al pin digitale 11  
  
void setup() {  
  pinMode(12, OUTPUT);     // imposta il pin digitale come output  
    pinMode(11, OUTPUT);     // imposta il pin digitale come output  

}  
  
void loop() {  
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH); // spegne il LED 
 delay(2000); 
  digitalWrite(12, HIGH);  // accende il LED  
  digitalWrite(11, LOW);  // accende il LED  
  delay(5000);              // aspetta un secondo  
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH); // spegne il LED  
  delay(2000);  
   digitalWrite(12, LOW);
  digitalWrite(11, HIGH); 
  delay(5000);  

}

Ciao! Certamente quello che chiedi è possibile, ma bisogna vedere se tu ora hai raggiunto una competenza sul linguaggio che ti permette di farlo :) Il codice da te postato non si avvicina neanche un po alla soluzione del tuo problema :)

1) Tu devi fare la stessa cosa alla pressione di un pulsante, ma su pin diversi e con valori diversi. Allora penso per prima cosa crearsi una funzione che lo faccia, non userai costanti dei pin,ma una variabile, alla pressione del pulsante alla variabile assegni il valore del pin-led su cui agire, poi richiami la funzione che accenderà o spegnerà il led.

2)Per calcolare la pausa di ore userai un ciclo while e la funzione mills, il ciclo continua fino a quando non sono passate le ore desiderate, all'interno del while leggerai la pressione del pulsante, se premuto cambi valore alla variabile che contiene il numero dei pin, e esci dal while con break.

In pratica, sia i pin dei led, sia i pin dei pulsanti, non sono individuati con costanti "sempre quelli", ma con variabili a cui assegnerai di volta in volta i pin che dovrai usare.

Millis() é utilizzabile se non desideri precisioni superiori al minuto, ed anche in quel caso su lungo periodo può sforare. Se vuoi precisioni superiori ti consiglio l'uso di un RTC. Esso assicura la precisione del secondo, se non di più. Ma chiaramente sarebbe una cosa in più da acquistare e saper usare. Comunque credo che il tuo problema si possa risolvere con un codice che faccia questo

//la loop deve fare
{
  Se (sento il tasto 1)
  {
    Finché (non sento il tasto 2)
    {
      Spengo il led di 2
      Accendo il led di 1
    }
    Accendo il led di 2
  }
  Altrimenti se (sento il tasto 2)
  {
    //sopra con invertiti 1 e 2
  }
  Aspetto due ore
}

É quello che vuoi fare? Come lo traduci?

detta semplice led11 e led 12 controllano un motore.
quando il led11 e 12 sono alti ho il motore fermo.
per qui quando arriva al relè si ferma. 2 ore
11 basso 12 alto gira orario
11 alto 12 basso gira anti orario

mentre 6 e il 7 o i rely

quando arriva al 6 o al 7 rimane fermo 2 ore poi passa al altro senso per 2 ore

Nel senso che: Inizia nella posizione A Va verso B Aspetta due ore muovendosi É a B. Si ferma Aspetta 2 ore fermo Riparte verso A Aspetta 2 ore muovendosi É a A Si ferma Aspetta 2 ore fermo Il ciclo ricomincia

Ho capito bene?

:) si proprio cosi la posizione A e B si devi fermare perchè avrò un fine corsa 0/1 sto usando un L298N

Ok. Quindi se é ESATTAMENTE come hi detto basta dire Muovo in un senso (sai tu come) delay (2*3600*1000) Spegni delay (2*3600*1000) Muovi nell'altro senso delay (2*3600*1000) Spegni delay (2*3600*1000)

Lo sai fare?

Io dal suo primo post avevo capito qualcosa di diverso! Il post non era molto chiaro e forse ho capito male :)

Però avevo capito che doveva leggere lo stato di due pulsanti durante le pause di 2 ore, se premuti la situazione doveva cambiare e fare altre cose... Ma forse ho capito male :)

Con 2 ore di delay come fa a leggere i fine corsa??? Inoltre, se è per un macchinario potenzialmente pericoloso, non si può fare da soli. Se è per un trenino o simile, invece, gioca quanto vuoi! :-)

Ecco il video per capire https://www.youtube.com/watch?v=R4voLvz_nYc devo solo mettere 2 fine corsa. cosi rimane fermo a 45 gradi ogni 2 ore

Ho scritto nel post numero 2 la descrizione italiana di un codice che dovrebbe fare quello che ho capito tu hai bisogno. Puoi per favore spiegare tu, a parole tue, Quali sono le differenze tra la descrizione ti ho dato io nel post 2 e il tuo desiderio? Inoltre, perdonami, ma se io dovessi far muovere un motore di Totti gradi ogni tot tempo mi comprerei un servo il quale può essere comandato direttamente in posizione. Chiaramente so che il lato hardware di un progetto non si può cambiare. Grazie del video, ma credo che sarebbe più utile una spiegazione precisa in parole tu e, in quanto è più facile capire un codice di cui si sa descrivere il comportamento, come è più facile scriverlo

Fai così:

void setup() 
{ 
 pinMode(11, OUTPUT);     // imposta il pin digitale come output 
 pinMode(12, OUTPUT);     // imposta il pin digitale come output 
} 

void loop() 
{
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
delay(2*3600*1000); // 2 ore

digitalWrite(12,HIGH);
digitalWrite(11,LOW);
delay(2*3600*1000); // 2 ore
}

Un microswitch deve commutare un filo del motore tra l'uscita 11 e massa; l'altro microswitch deve commutare l'altro filo del motore tra l'uscita 12 e massa. In questo modo ogni 2 ore il motore parte, poi si ferma quando scatta il fine corsa. Quando arriva corrente dall'altro pin, il motore riparte al contrario e si ferma quando scatta l'altro fine corsa.

Silente: Ho scritto nel post numero 2 la descrizione italiana di un codice che dovrebbe fare quello che ho capito tu hai bisogno. Puoi per favore spiegare tu, a parole tue, Quali sono le differenze tra la descrizione ti ho dato io nel post 2 e il tuo desiderio? Inoltre, perdonami, ma se io dovessi far muovere un motore di Totti gradi ogni tot tempo mi comprerei un servo il quale può essere comandato direttamente in posizione. Chiaramente so che il lato hardware di un progetto non si può cambiare. Grazie del video, ma credo che sarebbe più utile una spiegazione precisa in parole tu e, in quanto è più facile capire un codice di cui si sa descrivere il comportamento, come è più facile scriverlo

Avevo capito bene ma devi capire che sono alle prime armi non facile per me capire quel. Codice con le if

Ok. Chiedo scusa se son sembrato arrabbiato. Il programma postato da Datman é soluzione?

Datman: Fai così:

void setup() 
{ 
 pinMode(11, OUTPUT);     // imposta il pin digitale come output 
 pinMode(12, OUTPUT);     // imposta il pin digitale come output 
} 

void loop() { digitalWrite(11,HIGH); digitalWrite(12,LOW); delay(2*3600*1000); // 2 ore

digitalWrite(12,HIGH); digitalWrite(11,LOW); delay(2*3600*1000); // 2 ore }



Un microswitch deve commutare un filo del motore tra l'uscita 11 e massa;
l'altro microswitch deve commutare l'altro filo del motore tra l'uscita 12 e massa.
In questo modo ogni 2 ore il motore parte, poi si ferma quando scatta il fine corsa. Quando arriva corrente dall'altro pin, il motore riparte al contrario e si ferma quando scatta l'altro fine corsa.

questo codice funziona unica problema che il delay mi blocca il codice un if che ho nel programma oltre questo codice

Fai così:

byte a=0;
unsigned long t1=0;

void setup()
{
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
}

void loop() 
{
if(millis()-t1>2*3600*1000 && a==0)
  {
  a=1; t1=millis();
  digitalWrite(11,HIGH);
  digitalWrite(12,LOW);
  }

if(millis()-t1>2*3600*1000 && a==1)
  {
  a=1; t1=millis();
  digitalWrite(12,HIGH);
  digitalWrite(11,LOW);
  }
}

Come to ho detto prima, ti servono dei microswitch di fine corsa a deviatore, non semplici interruttori, e devono sopportare la corrente assorbita dal motore.

byte a=0;
unsigned long t1=0;
const int rely1 = 6;     // the number of the pushbutton pin
const int rely2 = 7;     // the number of the pushbutton pin
int relystat1 = 0; 
int relystat2 = 0; 



void setup()
{
pinMode(rely1, INPUT);
pinMode(rely2, INPUT);


digitalWrite(12,HIGH);
digitalWrite(11,LOW);


}

void loop() 
{
  relystat1 = digitalRead(rely1); 
  relystat2 = digitalRead(rely2); 
if(millis()-t1>2*3600*1000 && a==0 && (relystat1=LOW))
  {
  a=1; t1= millis();
  digitalWrite(11,HIGH);
  digitalWrite(12,LOW);
  }

if(millis()-t1>2*3600*1000 && a==1 && (relystat2=LOW) )
  {
  a=1; t1= millis();
  digitalWrite(12,HIGH);
  digitalWrite(11,LOW);
  }
}

ho dato una modifica mettendo 2 rely separati al arrivo del motore alla posizione esci della if e rimane fermo dici che va bene codice

??? Devi mettere un relè (relay in inglese) sull'11 (o sul 6) e uno sul 12 (o sul 7), senza modificare il programma (salvo usare il 6 e il 7 o errori).

[Risolto] Grazie a tutti

:)