Esecuzione codice alla chiusura di un ingresso

Salve, premetto che sono alle prime armi, ma arduino è troppo forte!!! No riesco a capire come fare qeusto: Alla chiusura di un pulsante (dando la 5V al digital input e con la resistenza da 100k a massa) arduino mi deve eseguire il codice che dico io (invio infrarossi per accensione condizionatore) una sola volta. Fino qui.... Però, nel nel mometo che il pulsante si apre, deve eseguire un'altro codice (spegnimento condizionatore) una sola volta.

Spero di essere stato chiaro... accetto punti di partenza per creare il codice corretto, perchè mi sto incartando. GRAZIE 1000

Benvenuto. :) Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Sinceramente non ho capito bene quel che vuoi fare. Se il pulsante lo premi e finchè è premuto deve fare una cosa e quando lo rilasci ne deve fare un'altra?

Ma è un pulsante o un interruttore? Se alla chiusura mandi il comando di accensione ed all'apertura quello di spengimento, credo tu voglia un interruttore. Non penso che vuoi mandare 2 comandi concorrenti nel giro di 1/2 secondo, no?

Grazie a voi, mi sono presentato nella sezione e ho dato una occhiata ai link.

Mi spiego meglio che forse riesco a spiegarvi la mia esigenza.
Ho una sonda di temperatura settata su una temperatura che quando avverte l’inalzzarsi della temperatura fa chiudere un contatto puro di un relè.
Ora io devo poter accendere un climatizztore via infrarossi ed ho pensato ad arduino uno.
Devo replicare con arduino e un circuito di emmissione infrarossi il telecomando con due stringhe, quella di accensione e quella di spegnimento.
Mi sono incriccato perchè il comando che ho a disposizione(il relè) è acceso/spento e quindi ad arduino devo dirgli che:
quando si chiude il relè(acceso) devi mandare la stringa ir di accensione;
poi il relè resterà chiuso e arduino non deve fare più nulla;
quando il relè passa nella modalità spento(aperto) arduino deve mandare la stinga di spegnimento;
Ringrazio tutti coloro che mi hanno e mi daranno una mano!
Grazie a tutti.

prendi una variabile di stato.

Se la varabile é diversa dalla lettura del contatto controlli se la lettura é HIGH o LOW. A secondo di HIGH o LOW mandi uno o l' altro codice al condizionatore. Poi memorizzi lo stato del entrata (contatto) nella variabile di stato.

loop()
{
  valoreContatto = digitalRead(Contatto);
  if (valoreContatto != statoContatto)
  { 
  if (valoreContatto == LOW ) spegni condizionatore
  if (valoreContatto == HIGH) accendi condizionatore
  statoContatto = valoreContatto;
  }
}

Ciao Uwe

Grazie Uwe, gentilissimo... ma data la mia non esperienza, hai un codice di esempio da postarmi? Ti ringrazio anticipatamente, gentilissimo.

Ti ho giá dato un pseudocodice. cerca "arduino button toggle" per esempio http://www.instructables.com/id/Beginner-Arduino/step15/Button-As-Toggle-Switch/ Ciao Uwe

Grazie per il suggerimento, ho scritto questo sotto il vostro suggerimento, ma c'è qualcosa che non và... Chiaramente ho utilizzato due led per simulare se tutto è ok, ma nulla, quando premo il bottone, resta acceso il led collegato al pin 11 e poi non succede più nulla.

Mi sono incriccato... ^_^ Grazie anticipatamente-

#define LED1 12
#define LED2 11
#define BUTTON 10

int valoreContatto = 0;
int statoContatto = 0;

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

void loop()
{
  valoreContatto = digitalRead(BUTTON);
  if (valoreContatto != statoContatto)
  { 
  if (valoreContatto == LOW ) 
      digitalWrite(LED1, LOW); //spegni condizionatore
      Serial.println("no");  
  
  if (valoreContatto == HIGH)     
   digitalWrite(LED2, HIGH); //accendi condizionatore
    Serial.println("si");  
  statoContatto = valoreContatto;
  }
}

ma la prova la devi fare con un solo led per vedere se si accende e si spegne... logico che se accendi led1 (che è spento) e poi spegni led2 (che è spento anche lui) non vedi accadere nulla. odifica LED2, HIGH con LED1, HIGH

Grazie per il suggerimento, ho capito l'errore, ma nulla non và, resta sempre acceso il LED2 appena tocco il pulsante e non si spegne più. Bò... cosa e dove sbaglio? nella logica forse?

Attendo info. Grazie 1000 a tutti. :drooling_face:

Hai una logica un pò contorta. Mi spiego. Tu stai usando un pulsante, giusto? E ne memorizzi lo stato precedente. Ragiona ora cosa fa il tuo programma. Parte con lo stato a 0, e controlla il pulsante. Se lo hai premuto, il pulsante è letto come HIGH, ossia 1, ed è diverso da 0, lo stato iniziale. Tu giustamente accendi il LED e ne memorizzi il nuovo stato. Ora, però, che succede? Lasciandolo, il pulsante verrà letto sempre come 0, LOW, perché non premuto. E ti dovrebbe stampare sempre "no" sulla seriale. Ma che succede non appena lo ripremi? Lo stato letto è uguale allo stato memorizzato quindi questo controllo: if (valoreContatto != statoContatto), sarà sempre falso e quindi quando premi il pulsante non entrerà mai nel ciclo di cambio di stato.

Grazie per avermi fatto capire che ero totalmente fuori strada… :disappointed_relieved:
Se può essere utile a qualcuno alle la soluzione con già i comandi infrarossi.
Per qualsiasi chiarimento, resto a disposizione. :slight_smile:

#define LED1 3
#define BUTTON 10
#include <IRremote.h>

int x=0;
int valoreContatto = 0;

unsigned int SignalA[] = {3320,1628,472,364,468,360,468,1184,468,360,468,1184,468,360,464,364,464,360,464,1196,440,1196,464,380,440,368,464,372,464,1188,464,1188,464,364,464,360,464,364,464,360,464,364,464,360,468,360,464,360,468,360,464,360,472,356,468,356,472,356,468,1184,468,364,464,360,464,364,464}; //AnalysIR Batch Export - RAW
unsigned int SignalS[] = {3344,1604,468,368,468,360,464,1184,468,360,468,1184,472,356,468,356,472,356,468,1180,476,1176,476,352,472,360,468,360,464,1184,468,1184,468,360,468,360,464}; //AnalysIR Batch Export - RAW

IRsend irsend;

void setup()
{
pinMode(LED1, OUTPUT);
pinMode(BUTTON, INPUT);
Serial.begin(9600);
}


void loop()
{
valoreContatto = digitalRead(BUTTON); 
if(valoreContatto==HIGH){
	delay(2500);
        if(x==0)
	{
irsend.sendRaw(SignalA, sizeof(SignalA)/sizeof(int), 38);
//Serial.println("ACCENDI");
x=1;
//Serial.println(x+5);
		}
	}
	
	if(valoreContatto==LOW){
	if(x==1)
	{
irsend.sendRaw(SignalS, sizeof(SignalS)/sizeof(int), 38);
//Serial.println("SPEGNI");
x=0;
//Serial.println(x+3);}
}
}