Se A è in funzione,non avviare B

Un saluto a tutti.

In un progetto ho 2 sensori di temperatura su onewire.
Questi vanno poi a comandare 2 ventole se leggono o meno una certa soglia di temperatura.

Il mio problema sorge qui.Le 2 temperature ogni tanto sono uguali,e mi fanno attivare entrambe le ventole.
Questo non deve accadere in questo progetto...

Che comando posso mettere per dire "Se la ventola A è in funzione,non attivare la B (anche se la temperatura è sopra la soglia di attivazione)

Ho provato con

if (A, HIGH)
{ 
analogWrite (B, 0);
if (B = HIGH)
analogWrite (A, 0);
}

ma non funziona.

Mi piacerebbe una cosa del tipo "se A è in funzion,non attivare B per 10 secondi" e viceversa.

Sapreste indirizzarmi?

Si, sia in versione bloccante con delay(), sia in versione non bloccante, con millis()
Tu quale vuoi?
Cosa vuoi fare?
Cominciamo così:
Metti il codice, quello giusto, che quello che hai messo è incompleto e sbagliato
Poi metti un po' di dettagli nella tua presentazione, visto che sembra un po' scarna e anche fuorviante per uno che ti vuole aiutare

L'if si scrive:

if(A==HIGH) {}
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define assey sensors.getTempCByIndex(1)
#define assex sensors.getTempCByIndex(0)
const int fany = 10;
const int fanx = 11;


void loop(void)
{
  lcd.setCursor(12, 0);
  lcd.write(0);
  lcd.setCursor(13, 0);
  lcd.print(" ");
  lcd.setCursor(12, 1);
  lcd.write(0);
  lcd.setCursor(13, 1);
  lcd.print(" ");

  { sensors.requestTemperatures();
    lcd.setCursor(7, 0);
    lcd.print (assey);
    lcd.setCursor(7, 1);
    lcd.print (assex);
   
    if (assex <= 34.9)       //INIZIO REGOLE ASSE x
      digitalWrite(fanx, LOW);
    if (assex >= 35)
      analogWrite(fanx, 18);
    if (assex >= 36)
      analogWrite(fanx, 20);
    if (assex >= 37)
      analogWrite(fanx, 22);
    if (assex >= 38)
      analogWrite(fanx, 24);
    if (assex >= 39)
      analogWrite(fanx, 26);
    if (assex >= 40)
      analogWrite(fanx, 28);
    if (assex >= 41)
      analogWrite(fanx, 30);
    if (assex >= 42)
      analogWrite(fanx, 35);
    if (assex >= 43)
      analogWrite(fanx, 100);
    if (assex >= 44)
      analogWrite(fanx, 125);
    if (assex >= 45)
      analogWrite(fanx, 150);
    if (assex >= 46)
      analogWrite(fanx, 175);
    if (assex >= 47)
      analogWrite(fanx, 200);
    if (assex >= 48)
      analogWrite(fanx, 225);
    if (assex >= 49)
      analogWrite(fanx, 250);
    if (assex >= 50)
      analogWrite(fanx, 255);
   



    if (assey  <= 34.9)                   //INIZIO REGOLE ASSE y
      digitalWrite(fany, LOW);
    if (assey  >= 35)
      analogWrite(fany, 18);
    if (assey  >= 36)
      analogWrite(fany, 20);
    if (assey  >= 37)
      analogWrite(fany, 22);
    if (assey  >= 38)
      analogWrite(fany, 24);
    if (assey  >= 39)
      analogWrite(fany, 26);
    if (assey  >= 40)
      analogWrite(fany, 28);
    if (assey  >= 41)
      analogWrite(fany, 30);
    if (assey  >= 42)
      analogWrite(fany, 35);
    if (assey  >= 43)
      analogWrite(fany, 100);
    if (assey  >= 44)
      analogWrite(fany, 125);
    if (assey  >= 45)
      analogWrite(fany, 150);
    if (assey  >= 46)
      analogWrite(fany, 175);
    if (assey  >= 47)
      analogWrite(fany, 200);
    if (assey  >= 48)
      analogWrite(fany, 225);
    if (assey  >= 49)
      analogWrite(fany, 250);
    if (assey  >= 50)
      analogWrite(fany, 255);
  }

Questo è il codice,preferirei senza delay

if (assex <= 34.9) {                    // se asse x é ferma
    if (assey  <= 34.9)                   //INIZIO REGOLE ASSE y
      digitalWrite(fany, LOW);
    if (assey  >= 35)
      analogWrite(fany, 18);
    ...
    if (assey  >= 50)
      analogWrite(fany, 255);
}

Cosí la ventola B parte solo se A é ferma.

Attenzione: Ventole spesso non funzionano se devono partire con giri bassi. Devi far partire la ventola per 2-3 secondi a tutta velocitá e poi abbassare alla velocitá desiderata.
Inoltre essendo dei motori brushless non funzionano bene con PWM. Devi usare ventole con entrata PWM.

Ciao Uwe

Grazie mille.Poi provo e ti faccio sapere.
Devo metterlo anche per l'altra ventola,o basta solo per 1?

Ps...Con I parametri che vedi funzionano entrambe le ventole

Quale é la condizione di funzionamento delle ventole?
Hai detto :Se A va B deve stare fermo.
Ci sono ancora altre condizioni?
Ciao Uwe

Ci vorrebbero un po' di else...

Si esatto. Se A va B deve essere ferma.
Ed anche viceversa

Io farei un ragionamento a stati. All'inizio lo stato é 0, e leggo tutti i sensori, vedendo se uno deve andare. Se nello stato 0 mi accrorgo che A deve andare passo allo stato 1. Nello stato 1 verifico soltanto il sensore A, e comando la corrispondente ventola. O prima o dopo spegnerò la ventola, quando questo succederà lo stato torna a 0, e potrò verificare nuovamente entrambi i sensori. Poi se trovo che deve andare il gruppo B lo stato diventa 2, stato nel quale verifico soltanto il sensore B ignorando l'A. Anche stavolta, quando ordinerò lo spegnimento della ventola B lo stato tornerà a 0, e il tutto ricomincia.
A lato pratico sto solo esplicitando quello che é stato chiesto, ma penso che abbia una forma molto più "inpilabile", rendendo più facili aggiunte di gruppi sensore/ventola (si sa mai servisse...).
Il problema di questo approccio (almeno potenzialmente) é che si rischia di far andare una ventola per raffreddare una situazione quasi normale, ignorando l'altra, che può raggiungere temperature critiche

Di temperature critiche (anche se una ventola è ferma) non sarà mai critica,anche perché all'attivazione di una,impiega pochi secondi a fare abbassare la temperatura.
Però molte volte padrona assieme,e non mi piace come cosa

zonalimitatore:
Si esatto. Se A va B deve essere ferma.
Ed anche viceversa

E se tutti due dovrebbero andare allora quale ventola deve andare?
se A va B ferma
se B va A ferma
Se dovrebbero andare sia A e B allora tutte due ferme?
Ciao Uwe

uwefed:
E se tutti due dovrebbero andare allora quale ventola deve andare?
se A va B ferma
se B va A ferma
Se dovrebbero andare sia A e B allora tutte due ferme?
Ciao Uwe

È questo il mio quesito... Non so che comportamento ha se compilo un codice così.
Cioè, penso sia rara una situazione del genere. Però se per pura sfortuna si ritrova con il dover far funzionare entrambe le ventole, non so a chi dà priorità.... Forse alla prima ventola nel codice?

C'é un modo semplice per saperlo, basta provare.
Comunque tieni conto che é un caso MOLTO raro, ricorda che stai parlando di una macchina, quindi anche un secondo é un tempo eterno per lei, quindi dubito che possa succedere.

zonalimitatore:
È questo il mio quesito... Non so che comportamento ha se compilo un codice così. Cioè, penso sia rara una situazione del genere. Però se per pura sfortuna si ritrova con il dover far funzionare entrambe le ventole, non so a chi dà priorità.... Forse alla prima ventola nel codice?

A differenza del "mondo reale" intrinsecamente asincrono in cui le cose possono accadere contemporaneamente, e dei sistemi (elettronici o software) sincroni in cui ancora può esserci concorrenza temporale con comportamenti instabili e oscillatorii, le normali righe di codice seguono una terza via: vengono eseguite in sequenza una dopo l'altra, quindi se la prima disattiva la variabile B, la seconda trova B disattiva e non può a sua volta disattivare A.

Perfetto,quindi dite di provare il codice postato da @uefed nel post #4?

Come deve funzionare il Sketch lo decidi Tu. Devi Tu decidere le condizioni e poi tradurrle in codice.
Allora hai 2 variabili di entrata e 2 uscite. Fai la tabella della veritá per capire cosa fare.

A < limite e B < limite
A > limite e B < limite
A < limite e B > limite
A > limite e B > limite

Ciao Uwe

uwefed:
Come deve funzionare il Sketch lo decidi Tu. Devi Tu decidere le condizioni e poi tradurrle in codice.
Allora hai 2 variabili di entrata e 2 uscite. Fai la tabella della veritá per capire cosa fare.

A < limite e B < limite
A > limite e B < limite
A < limite e B > limite
A > limite e B > limite

Ciao Uwe

Peronami,ma non riesco a capire cosa intendi con "limite"

Penso intenda utilizzare la parola col suo significato. Visto che si sta parlando di ventole che devono raffreddare determinate cose quando queste superano una certa temperatura misurata, molto probabilmente esisterà un valore di temperatura superato il quale si considera l'oggetto troppo caldo, e quindi sarà necessario accendere la ventola (o Almeno io un sistema del genere lo userei così)

Ok.Quindi dite di usare l'& al posto di singole regole?
Del tipo:

se A e B sotto il limite,va avanti
Se A è sopra il limite e B no,attiva solo A
Se B è sopra il limite e A no,attiva solo B
Se A e B son sopra il limite, attiva solo A

If (A || B).....