Ciao ragazzi. sto creando un progetto per l'irrigazione di un piccolo vaso con Arduino uno R4 wifi. Dalla dashboard IoT vorrei poter impostare la modalità automatica, che in base al dato del sensore di umidità del terreno accende o spegna la pompa. e disattivando l'automatico vado in manuale che tramite uno switch o un pulsante eroga l'acqua. Il manuale già funziona, l'automatico ancora no perchè non so come fare. Mi potete aiutare? Vi lascio qui sotto il codice.
Ho creato le variabili:
relay_1 - che serve ad attivare o disattivare il relè
sensor - mi permette di visualizzare il dato
automatico - che mi dovrebbe permettere di impostare io switch della dashboard
Inoltre vorrei visualizzare il dato del sensore in percentuale da 1 a 100 solo che non riesco ad impostarlo.
#include "thingProperties.h"
const int relayPin = 2;
void setup() {
Serial.begin(9600);
delay(1500);
pinMode(relayPin, OUTPUT);
initProperties();
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
void loop() {
ArduinoCloud.update();
int result;
sensor = analogRead(A0);
result = map(sensor, 0, 1023, 100, 0);
}
void onRelay1Change() {
if(relay_1){
digitalWrite(relayPin, LOW);
}
else{
digitalWrite(relayPin, HIGH);
}
}
void onSensorChange() {
}
void onAutomaticoChange() {
if(sensor < 400){
digitalWrite(relayPin, LOW);
}
else {
digitalWrite(relayPin, HIGH);
}
}
- Se il sensor è quello che visualizzi in dashboard, penso che lo devi per forza ricalcolare in percentuale, inverti result e sensor. Ovviamente ora sensor è da 0 a 100 e non da 0 a 1023
int result;
result = analogRead(A0);
sensor = map(result, 0, 1023, 100, 0);
- Scusa ma dove è nel programma la variabile "automatico" ??
Intanto credo che se tu imposti automatico dovresti "disabilitare" Relay1Change()
Ma dovresti anche far sapere a ArduinoCloud che non hai potuto accendere o spegnere rele
void onRelay1Change()
{ if(automatico)
{ // in automatico non puoi accedere/spegnere da pulsante
// come dire ad ArduinoCloud che non ha funzionato ?
relay_1=false; // non sò se Arduinoloud lo accetta
}
else
{ if(relay_1) // in manuale
{ digitalWrite(relayPin, LOW);
}
else
{ digitalWrite(relayPin, HIGH);
}
}
}
Poi la onAutomaticoChange non deve fare nulla
Invece quello che hai scritto li dentro deve essere nella loop()
Ma lo devi fare solo se automatico è vero (occhio che sensor ora è 100-0 non 0-1023)
void loop()
{ ArduinoCloud.update();
...
if(automatico)
{ if(sensor < ?? ) // era 400 ma ora sensor è da 0 a 100 !!
{ digitalWrite(relayPin, LOW);
relay_1=true; // ArduinoCloud lo accetta ??
}
else
{ digitalWrite(relayPin, HIGH);
relay_1=false; // ArduinoCloud lo accetta ??
}
}
} // loop
Grazie per i consigli e il codice. Funziona tutto senza nessun problema. Ne approfitto per chiederti, aggiungerò un DHT11 per sapere la temperatura. Sai dirmi come sottrarre due gradi al risultato che mi darà? visto che il sensore mi fornisce sempre due grandi in più vorrei modificarlo manualmente.
ah. Mi piacerebbe inoltre, che quando la modalità automatica è disattiva, il relè, ad un eventuale riavvio/accessione di Arduino si imposti automaticamente su LOW per evitare mi parta l'irrigazione a caso. come posso fare?
Non so, il problema è ArduinoIoT. Ho fatto solo alcuni esperimenti qualche anno fa con MKR1010
Al riavvio di Arduino non sò come sia "sincronizzato" con i dati sul cloud.
Per il dht, fai semplicemente una sottrazione dopo aver letto il sensore
sensordht = dht.readTemperature() -2 ;
Dopo pinmode spegni relè. Prova.
Ciao. chiedo ancora a te. Ho aggiunto al mio progetto altri due sensori, quindi ho sensor1,sensor2 e sensor3
solo che nella dashboard con i widget della percentuale, anche se metto le variabili diverse, mi mostrano tutti il sensor1. come faccio? in oltre nell'if automatico vorrei aggiungere oltre a sensor1 anche gli altri, in modo tale che se uno dei sensori mi rileva un dato basso accende il relè.
#include "thingProperties.h"
#include <EduIntro.h>
DHT11 dht11(A0);
const int relayPin = 2;
void setup() {
Serial.begin(9600);
delay(1500);
pinMode(relayPin, OUTPUT);
initProperties();
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
void loop() {
ArduinoCloud.update();
dht11.update();
temperature = dht11.readCelsius() - 2;
humidity = dht11.readHumidity();
int result3;
result3 = analogRead(A3);
sensor3 = map(result3, 0, 1023, 100, 0);
int result2;
result2 = analogRead(A2);
sensor2 = map(result2, 0, 1023, 100, 0);
int result1;
result1 = analogRead(A1);
sensor1 = map(result1, 0, 1023, 100, 0);
if (automatico)
{ if (sensor1 < 60 )
{ digitalWrite(relayPin, LOW);
relay_1 = true;
}
else
{ digitalWrite(relayPin, HIGH);
relay_1 = false;
}
}
}
void onRelay1Change() {
{ if (automatico)
{
relay_1 = false;
}
else
{ if (relay_1)
{ digitalWrite(relayPin, LOW);
}
else
{ digitalWrite(relayPin, HIGH);
}
}
}
}
void onAutomaticoChange() {
}
void onTemperatureChange() {
}
void onHumidityChange() {
}
void onSensor1Change() {
}
void onSensor2Change() {
}
void onSensor3Change() {
}
Strano. Ma che sensori sono i 2 e il 3?
sempre sensori di umidità del terreno
risolto. ora devo solo aggiungere la fotoresistenza e mettere i valori da 1 a 100. faccio come con i sensori?
Si.
Sarebbe utile sapere come hai risolto. Può servire per altri utenti del forum che potrebbero incappare nello stesso problema.
Semplicemente non avendo collegato tutti e 3 i sensori contemporaneamente mi segnava dei valori simili su tutti e 3 i widget. una volta collegati funziona alla perfezione.
Ora volevo capire come far si che se attivo la modalità automatica, basta uno dei sensori sotto una certa soglia a far attivare il relè e non solo sensor1
if (automatico)
{ if (sensor1 < 60 )
{ digitalWrite(relayPin, LOW);
relay_1 = true;
}
else
{ digitalWrite(relayPin, HIGH);
relay_1 = false;
}
}
Per quanto riguarda la fotoresistenza ora funziona bene. grazie
ok. domani provo, ma se volessi far accendere il relè quando il valore è minore di 60 ma spegnerlo quando è maggiore di 80? come posso modificare il mio if?
o forse sarebbe meglio tipo da quando si accende, dopo 10 secondi si spegne? non saprei ci devo riflettere anche un po'
Non capisco la domanda.
Se lo accendi quando è sotto i 60, vuol dire che lo spegni nell'altro caso, ovvero appena supera 60
il relè deve accendere la pompa sotto il 60 e spegnerla sopra l'80
Non ha senso. Il rele o è acceso oppure è spento.
Sensore: sotto i 60 primo caso, tra 60 e 80 secondo caso, oltre 80 terzo caso.
Tre casi ma il rele può essere solo in 2 casi o acceso o spento.
La stai già spegnendo quando superi 60. Ben prima degli 80
Puoi provare così ma non sono sicuro sia quello che ti aspetti
if (automatico)
{ if (sensor1 < 60 )
{ digitalWrite(relayPin, LOW); //accendo
relay_1 = true;
}
else if (sensor1 > 80 )
{ digitalWrite(relayPin, HIGH); //spengo
relay_1 = false;
}
}