Salve, sto provando a fare qualcosa con arduino che mi faccia un programma per la lavatrice.
ho preso una lavatrice e la rifaccio da capo con arduino.
ho da gestire come uscite tramite scheda rele : lavaggio che gira a dx; lavaggio che gira a sx; carico acqua; scarico acqua; centrifuga.
ho pensato di creare delle funzioni chiamate lavaggiodx; lavaggiosx etc x richiamare nel loop ogni cosa.
per il carico acqua userei il pressostato come un bottone tramite relè( cioè il pressostato alimenta il relè che fa passare la 5v ad arduino che tramite programma con un IF verifica che se c'è tensione nn è il momento di cominciare xkè sta ancora caricando l'acqua).
che ne dite sia possibile?
un 'altra domanda al termine di tutte le operazioni come si ferma il ciclo? cioè vorrei che il loop lo eseguisse una sola volta all'accensione dell'arduino.
hai dimenticato, temperature, livelli acqua economico, abbondante, centrifuga con variatore di velocità, ammobirbente, detersivo in 2 passaggi. Ma la lavatrice così come era non funzionava?
l'ho compilato e nn da nessun errore
suggerimenti x migliorarlo?
vorrei sapere come eseguire una sola volta il programma
e come impostare l'IF
grazie
#define giradx 13
#define girasx 12
#define carico 11
#define scarico 10
#define centrifuga 9
#define livello1 8
#define livello2 7
void setup() {
pinMode(giradx, OUTPUT);
pinMode(girasx, OUTPUT);
pinMode(carico, OUTPUT);
pinMode(scarico, OUTPUT);
pinMode(centrifuga, OUTPUT);
pinMode(livello1, INPUT);
pinMode(livello2, INPUT);
int statolivello1=0;
}
void loop() {
digitalWrite(carico, HIGH);//deve essseere sostituito da un if//
delay(2000);
digitalWrite(carico, LOW);
lavaggio();
delay(2000);
lavaggio();
delay(2000);
lavaggio();
delay(2000);
centri_e_scarico();
}
void lavaggio() {
digitalWrite(giradx, HIGH);
delay(20000);
digitalWrite(giradx, LOW);
delay(5000);
digitalWrite(girasx, HIGH);
delay(20000);
digitalWrite(girasx, LOW);
delay(5000);
}
void centri_e_scarico(){
digitalWrite(scarico, HIGH);
lavaggio();
delay(2000);
digitalWrite(centrifuga, HIGH);
delay(15000);
digitalWrite(centrifuga, LOW);
delay(2000);
digitalWrite(scarico, LOW);
}
pablos:
hai dimenticato, temperature, livelli acqua economico, abbondante, centrifuga con variatore di velocità, ammobirbente, detersivo in 2 passaggi. Ma la lavatrice così come era non funzionava?
certo ke funzionava....ma voglio un programma di lavaggio personalizzato
cerozziello88:
vorrei sapere come eseguire una sola volta il programma
e come impostare l'IF
Al posto dell'IF potresti mettere uno switch case: switch...case - Arduino Reference e terminarlo in attesa di una nuova selezione del ciclo con un while su seriale.
Paolo.
Dubito che Tu riuscirai trovare un programma migliore di quello che hanno saputo creare i progettisti della lavatrice.
Toglietemi un dubbio: anni fa, un argomento di pubicitá per caratterizzare un prodotto migliore di quelli della concorenza era il pilotaggio con logica Fuzzy. Logica fuzzy - Wikipedia
È ancora cosí?
Ciao Uwe
Ciao anche io a tempo perso sto sviluppando un programma per la lavatrice.
Ma tu che lavatrice hai?
boolean end_washing = false;
void loop() {
if (!end_washing) {
digitalWrite(carico, HIGH);//deve essseere sostituito da un if//
delay(2000);
digitalWrite(carico, LOW);
lavaggio();
delay(2000);
lavaggio();
delay(2000);
lavaggio();
delay(2000);
centri_e_scarico();
}
end_washing = true;
Alla prima esecuzione del loop la condizione !end_washing e vera, perché la negazione di false vale vero, quindi esegue il blocco della if. Alla fine del loop end_washing = true, la negazione di true è false ed il codice nella if non viene più eseguito. Per rifare tutto il ciclo sei costretto a resettare Arduino, oppure usare un pulsante che rimette le cose nella condizione iniziale, cioè end_washing = false;
Ciao.
Entra solo una volta nella if, perchè alla fine end_washing = true. Al primo loop
Bella la funzione negazione, se ho capito equivale a fare !0=1
Funziona anche se invece di true e false si usano 0 e 1 ?
Testato:
Bella la funzione negazione, se ho capito equivale a fare !0=1
Funziona anche se invece di true e false si usano 0 e 1 ?
! equivale a NOT logico. Quindi ripassando la logica booleana:
NOT 0 = 1
NOT 1 = 0
Siccome TRUE è un alias per 1 e FALSE è un alias per 0, mettere NOT TRUE, cioè !true equivale a fare !1 e viceversa
Bella la funzione negazione, se ho capito equivale a fare !0=1
Funziona anche se invece di true e false si usano 0 e 1 ?
Non vi è motivo per cui non debba funzionare, tuttavia non ho mai provato ad usare delle costanti numeriche manifeste. Un bool notrue = !(bool)1 dovrebbe funzionare di sicuro, qui c'è la necessità di castare la costante numerica "1" al tipo "bool", dopo di che "!" nega il risultato assegnato a "notrue".
C'è anche da notare che verificando una condizione "if", questa considera "vera" tutti i valori positivi, mentre 0, -1 ecc li considera "falso".
Quindi:
int check_bool = -10;
loop() {
check_bool++;
if (check_bool) {
fai qualcosa...
}
}
Questo codice esegue "fai qualcosa...", quando il contatore "check_bool" da "-10" è arrivato a "1", e continua fintanto che il contatore non va in overflow, ripartendo da valori negativi ed in tal caso non esegue "fai qualcosa..."
Ciao.
leo quello era chiaro, e' copiato dai fondamenti dell'elettronica digitale :), la domanda mia era su quello che mi ha risposto mauro,
per quanto riguarda il secondo esempio che hai fatto, del numero negativo, il Fai Qualcosa viene eseguito solo quando si raggiunge il valore 1, ma poi quando passa a 2 e continua verso l'overflow non esegue nulla, giusto ?
grazie ad entrambi
Testato, un valore pari a 0 è FALSE, un valore pari o superiore a 1 è TRUE, quindi 1, 10, 100 sono sempre TRUE.
!1 o !10 è sempre FALSE
(se è questo quello che volevi sapere)
grazie ora tutto chiaro, credevo che true corrispondesse solo al valore 1. Grazie
per quanto riguarda il secondo esempio che hai fatto, del numero negativo, il Fai Qualcosa viene eseguito solo quando si raggiunge il valore 1, ma poi quando passa a 2 e continua verso l'overflow non esegue nulla, giusto ?
Lo scritto qua, ma forse non è tanto esplicito, dice quello che ha detto leo72.
C'è anche da notare che verificando una condizione "if", questa considera "vera" tutti i valori positivi, mentre 0, -1 ecc li considera "falso".
Ciao.
void loop() {
caricoacqua();
lavaggio1();
delay(2000);
lavaggio2();
delay(2000);
lavaggio3();
delay(2000);
centri_e_scarico();
}
ho abbozzato un tipo di programma per la lavatrice, solo che mi chiedevo, visto che arduino esegue tutto in cascata,
come posso tramite input o interrupt esterno mentre sta facendo il primo ciclo di lavaggio (lavaggio1) passare a centri_e_scarico saltando
le altre 2 fasi di lavaggio? ho sentito parlare di goto e interrupt.
grazie
Dentro a lavaggio1() ci sarà un timer prestabilito, trascorso quel delta tempo fai un salto alla funzione centrifiga() e ritorna
altrimenti il comando centrifuga, che si tratterà alla fine di qualche riga la ripeti tutte le volte che ti serve
pablos:
Dentro a lavaggio1() ci sarà un timer prestabilito, trascorso quel delta tempo fai un salto alla funzione centrifiga() e ritorna
altrimenti il comando centrifuga, che si tratterà alla fine di qualche riga la ripeti tutte le volte che ti serve
puoi spiegarti meglio?
il salto a una funzione successiva deve avvenire da un input esterno.
dovrei anche usare una sonda di temperatura per l'acqua calda; vanno bene le classiche ntc o ptc? come vanno collegate?
nn credo si possa immergere un lm35 nell'acqua.
vendono i sensori temperatura sigillati appositamente per acqua. io ho visto il 18b20 sigillato
Scusa ma la lavatrice la stai facendo da zero compresa la meccanica? Normalmente esiste già nella vasca sulla parte bassa il sensore temperatura come i tubicini compreso il livellostato a membrana, la resistenza a immersione per riscaldare l'acqua.