aiuto comando or

salve a tutti... mi sono iscritto credo ormai 3 o 4 mesi fa...
sto lavorando alla tesina per l'esame di maturità..
ma sin dal inizio ho riscontrato un problema..
premetto che io faccio un professionale indirizzo manutenzione meccanica ed elettrica (impianti civili-industriali)
ma mi ha sempre affascinato il mondo della domotica...
arriviamo al mio progetto..
in questa parte mi sono bloccato dopo aver fatto i vari programmi singolarmente..
il fatto di unire i vari programmi ma ha portato il problema del comando or..

SCOPO:
impianto di riscaldamento refrigeramento..
comandato sia da termometro da pulsante per bypassare il termometro e via bluetooth..

PROBLEMA:
non so come fare il comando or..
non trovo nulla in rete..
vorrei fare in modo e maniera che..
termostato fa partire il condizionatore se supera i 20 gradi la stanza..
pulsante fa partire condizionatore se premuto..
bluetooth fa partire condizionatore se attivato da..

termometro disattiva condizionatore se la temperatura scende sotto i 20 gradi..
pulsante disattiva il condizionatore quando voglio..
bluetooth solita cosa pulsante..

spero di essere stato assai chiaro..
spero in tante risposte..
grazie in anticipo a tutti!!

Partiamo da un presupposto: il tuo condizionatore può assumere lo stato di acceso o spento indipendentemente da chi glielo chiede.

Quindi ti memorizzi lo stato del condizionatore e ogni volta che si verifica un evento termostato, pulsante o bluetooth verifichi in che stato sei e agisci di conseguenza. Il tutto può funzionare senza "or".

Se non sono stato chiaro dillo e provo a spiegarmi meglio altrimenti prova a buttare giù uno sketch e postalo, poi vediamo.

Ciao

Attilio

salve Attilio e grazie della risposta..
sinceramente non so se ho afferrato il concetto..
ma se ho capito bene lei dice che posso accendere il condizionatore da tutti e tre i punti senza necessita della or.. giusto??
nel caso non era quello che intendevo.. perché si lo posso accendere facendo come dice lei.. ma non posso spegnerlo...

ESEMPIO:
nel caso che temperatura superiore ai 20 gradi.. la ventola parte (ventola simula il condizionatore)
ma non posso spegnerla tramite pulsante come dice lei..

non so se può esserle d'aiuto il mio sketch a capire meglio lo posto qui sotto..

int ventola= 11;  //pulsante termostato
int termo= A0;
int temp= 0;      //pulsante termostato


int puls=A1;   //termostato
int val=0;
int stato=0;  //termostato

#include <SoftwareSerial.h>  //libreria seriale

SoftwareSerial mySerial(9, 10); // pin comunicazione seriale pin: RX=>10 TX=>9

void setup(){
 pinMode(ventola, OUTPUT); //blouetooth
  mySerial.begin(9600); 
  Serial.println("dexter");  
  delay(1000);
  {
 Serial.begin(9600);
}                           //bloutooth


{
 Serial.begin(9600);       //termostato
 pinMode(ventola,OUTPUT);
 pinMode(termo,INPUT);     //termostato


 {
 pinMode(ventola, OUTPUT);  //pulsante termostato
 pinMode(puls, INPUT);      //pulsante termostato
 
 }
}
}
void loop(){

  while (mySerial.available())    //blouetooth
  {
      char dato= mySerial.read(); 
      switch(dato)
      {
        case 'A': // Se ricevo la lettera A,
        {
 digitalWrite(ventola, HIGH); // attivo il relè ventola
           mySerial.println("Relè 1 ON");
          break;
        }
        case 'a': // Se ricevo la lettera a
        {
 digitalWrite(ventola, LOW); // Spengo il relè
          mySerial.println("Relè 1 OFF");
          break;
        }     
      }  
      }                                   //blouetooth

 
 
 int valore = analogRead(termo);   //termostato
 temp = (5*valore*100/1024);
 Serial.print (temp);
 delay(200);

 if(temp>25){
   digitalWrite(ventola,HIGH);
 }
 else{
   digitalWrite(ventola,LOW);
 }                               //termostato


{
 val=digitalRead(puls);   //pulsante termostato
 
 if(val==1) {
   stato=1-stato;
   delay(400);
   }
 
 if (stato==1) {
   digitalWrite(ventola, HIGH);
   }
   
   else {
     digitalWrite(ventola, LOW);
     }
 
 }                      //pulsante termostato

}

Ciao Galnati,
posta lo sketch inserito dentro gli apici <Code> (tastino </>) altrimenti non si capisce il codice !

Zamundo intende cosi??

int ventola= 11;  //pulsante termostato
int termo= A0;
int temp= 0;      //pulsante termostato


int puls=A1;   //termostato
int val=0;
int stato=0;  //termostato

#include <SoftwareSerial.h>  //libreria seriale //bluetooth

SoftwareSerial mySerial(9, 10); // pin comunicazione seriale pin: RX=>10 TX=>9  //bluetooth

void setup(){
  pinMode(ventola, OUTPUT); //blouetooth
   mySerial.begin(9600); 
   Serial.println("dexter");  
   delay(1000);
   {
  Serial.begin(9600);
}                           //bloutooth


{
  Serial.begin(9600);       //termostato
  pinMode(ventola,OUTPUT);
  pinMode(termo,INPUT);     //termostato


  {
  pinMode(ventola, OUTPUT);  //pulsante termostato
  pinMode(puls, INPUT);      //pulsante termostato
  
  }
}
}
void loop(){

   while (mySerial.available())    //blouetooth
   {
       char dato= mySerial.read(); 
       switch(dato)
       {
         case 'A': // Se ricevo la lettera A,
         {
  digitalWrite(ventola, HIGH); // attivo il relè ventola
            mySerial.println("Relè 1 ON");
           break;
         }
         case 'a': // Se ricevo la lettera a
         {
  digitalWrite(ventola, LOW); // Spengo il relè
           mySerial.println("Relè 1 OFF");
           break;
         }     
       }  
       }                                   //blouetooth

  
  
  int valore = analogRead(termo);   //termostato
  temp = (5*valore*100/1024);
  Serial.print (temp);
  delay(200);

  if(temp>25){
    digitalWrite(ventola,HIGH);
  }
  else{
    digitalWrite(ventola,LOW);
  }                               //termostato


{
  val=digitalRead(puls);   //pulsante termostato
  
  if(val==1) {
    stato=1-stato;
    delay(400);
    }
  
  if (stato==1) {
    digitalWrite(ventola, HIGH);
    }
    
    else {
      digitalWrite(ventola, LOW);
      }
  
  }                      //pulsante termostato

}

Ho letto un po' di corsa, perchè è ora di cena .... comunque:

  1. Scrivi meglio i commenti, altrimenti non aiutano noi e soprattutto dopo un mese (quando lo rileggi) non aiutano te..... noterai quante volte c'è scritto "termostato" anche se in realtà sono "blocchi logici" completamente diversi... quindi specifica di più e meglio

  2. Ti mostro un'idea... poi prova a svilupparla.... anzicchè far "comandare" direttamente dalle tre possibilità (pulsante, sensore T e bluetooth) il digital write, devi far comandare loro uno stato (come consigliato da ultimo_53)

if lettera "A" da bluetooth azione=true
if pulsante premuto azione=true
if temp>25 azione=true

else false

if (azione) // Ossia se azione è true 
   {  
     digitalWrite(ventola, HIGH); // attivo il relè ventola
   }  
   else 
   {  
     digitalWrite(ventola, LOW); // Spengo il relè
   }

In questo modo ognuno può agire ed accendere o spegnere la ventola a seconda del suo stato

PS Qui ci diamo tutti del tu :slight_smile:

scusa ma non capisco il comando che mi dite voi dover lo devo mettere "al posto di cosa"..
sono alle prime armi e mi perdo con nulla.. :confused:

Intanto, almeno per quanto mi riguarda, lasciamo perdere il "lei", quì siamo un gruppo di appassionati che si scambiano idee consigli e ogni tanto battute per farsi due risate.

Quello che intendo io è esattamente ciò che ti ha detto Zamundo, ovvero non devi comandare direttamente il condizionatore ma, con il pulsante, ecc. ma variare uno stato che poi gestirà il condizionatore.

Cerco di spiegarmi meglio:

I comandi di accensione se trovano lo stato in OFF lo metteranno in ON altrimenti lasciano le cose come stanno.
Stessa cosa faranno i comandi che spengono, metteranno in OFF se trovano in ON oppure non faranno nulla.
Sarà poi, controllando la condizione dello stato, che verrà comandato il condizionatore.

Dammi un attimo di tempo e provo a buttare giù qualcosa che ti chiarisca meglio il concetto.

Attilio

@galnati: cortesemente, in conformità al regolamento, punto 7, edita (in basso a destra del post, bottone More -> Modify) il tuo post e racchiudi il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

Rieccomi,

sia Zamundo che io ti abbiamo fornito degli spunti di riflessione per la soluzione del tuo problema. Ciò che è stato proposto è, come quasi sempre in programmazione, una soluzione e non l'unica soluzione.
Ora provo a svilupparla, in prima battuta concettualmente.

Tu hai la necessità di comandare qualcosa (condizionatore, lampadina, ecc.) attraverso N input diversi; quindi:

Ti servono 2 variabili di stato, diciamo "old_stat" e "new_stat" per salvare lo stato corrente e lo stato futuro e le metti entrambe a 0.
Ti servono pure due variabili per le soglie di temperatura, diciamo "t_max" e "t_min" che imposterai secondo le tue necessità.

byte old_stat = 0;
byte new_stat = 0;
int t_max = 25;
int t_min = 20;

All'interno del loop controlli lo stato dei pin a cui fanno capo i pulsanti di ON e OFF, diciamo "pin_on" e "pin_off".

if (pin_on == HIGH)   //pulsante ON premuto
{
   new_stat = 1;
}

if (pin_off == HIGH)   //pulsante "OFF" premuto
{
   new_stat = 0;
}

sempre nel loop leggi il valore della temperatura corrente, diciamo "t_corr", e lo confronti con le soglie

switch (t_corr)
{
   case > t_max:
      new_stat = 1;
      break;
   case < t_min:
      new_stat = 0;
      break;
}

Allo stesso modo controlli gli altri comandi in input.

Alla fine, sempre nel loop, controlli le due variabili di stato

if (new_stat != old_stat)
{
   routine_controllo();
}

Fuori dal loop

void routine_controllo()
{
   digitalWrite(NomePin, new_stat);   //applico al pin di comando il valore di new_stat
   old_stat = new_stat;   //metto uguali le due variabili di controllo
}

Salvo errori ed omissioni questo è il succo della questione.
Prova a buttare giù uno sketch completo e testalo, poi vediamo.

Ciao

Attilio