ciao, io nel mio progetto ho sostituito un pulsante meccanico con uno touch ma ora devo "rifinire" il software".
il problema è che (giustamente) appena sfioro il sensore touch mi prende il comando, invece io vorrei fare che devo tenerlo premuto per almeno 1,5/2 secondi. e poi ho il problema che se tengo il dito lì accende/spegne in continuo, io avevo messo un ritardo di 1 secondo, ma se passano cambia lo stato.
si può fare che sin che non tolgo il dito non cambi lo stato?
allego lo sketch
per capire dovè il problema l'ho evidenziato tracciando 2 righe lunghe... il problema è lì che mi va in loop tra i due stati
grazie
#include <DHT.h> //libreria sensore temperatura
#include <StepperMotor.h>//libreria motore passopassp
#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE); // associazione parametri sensore temperatura
int stato; //per funzione relè
int val=27; // temperatura da mantenere (MODIFICABILE A PIACIMENTO)
int intervallo=5000; //tempo tra 2 letture in millisecondi (MODIFICABILE A PIACIMENTO)
int tempomanuale=15000; //tempo durata riscaldamento manuale (MODIFICABILE A PIACIMENTO)
int temp; //variabile temperatura
int ledstato = 3; //led giallo di notifica (spento=sitema a riposo) (acceso=sistema attivo) (fadein fadeout statomanuale a tempo) (lampeggiante= anomalia posizione motore)
int ledmovimento = 2; //modulo lampeggiante su relè (led rosso)
int rele = 4; //relè riscaldamento
int startcentrale = 5; //comando da antifurto per avvio sistema
int finecorsa = 6; //finecorsa per motore passopasso
int riarmo = 7; //pulsante per spegnere il sistema
int _PIN1 = 8; //pin motore
int _PIN2 = 9; //pin motore
int _PIN3 = 10; //pin motore
int _PIN4 = 11; //pin motore
int punto0 = 0; //variabile per reset motore
int statoprec = 0; //variabile stato precedente
unsigned long timeout; //tempo di accensione riscaldamento manuale
unsigned long iniziomanuale; //variabile per temporizzatore manuale
int brightness = 0; // luminosità led a 0 alla partenza fadein
int fadeAmount = 5; // velocità fadein
bool fadein =false; //definizione stato fade-in
StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4); //assegnazione pin motore
unsigned long tempinterval; //intervallo tra 2 letture di temperatura
bool blinking = false; //definizione stato per lampeggio
unsigned long blinkInterval = 110; // millisecondi di lampeggio
unsigned long currentMillis; // variabile per lampeggio
unsigned long previousMillis; //variabile per lampeggio
void setup()
{
pinMode(startcentrale, INPUT_PULLUP); //pulsante avvio sistema
pinMode(finecorsa, INPUT_PULLUP); //pulsante lampeggio movimento/reset motore
pinMode(riarmo, INPUT); //pulsante touch riarmo
pinMode(ledstato, OUTPUT); // led stato sistema prenotato
pinMode(rele, OUTPUT); //relè riscaldamento
pinMode(ledmovimento, OUTPUT); //relè led lampeggio movimento
stato=0; //per funzione relè
pinMode(DHTPIN, INPUT); // sensore temperatura
stepper.setPeriod(1); //velocità motore passopasso in millisecondi (1 massimo)
digitalWrite (rele, HIGH); //stato relè spento ad accensione
digitalWrite (ledmovimento, LOW); //stato relè lampeggio led rosso spento
pinMode(_PIN1, OUTPUT); //pin motore
pinMode(_PIN2, OUTPUT); //pin motore
pinMode(_PIN3, OUTPUT); //pin motore
pinMode(_PIN4, OUTPUT); //pin motore
tempinterval=millis(); //variabile per i timer
Serial.begin(9600); // inizializzo la comunicazione seriale
dht.begin(); // inizializzo la comunicazione del sensore temperatura
digitalRead (finecorsa); //lettura pulsante finecorsa
punto0 = digitalRead(finecorsa); //variabile per reset iniziale
digitalWrite (ledmovimento, HIGH); //accensione led lampeggio rosso
stepper.move (1700); //leggero allontanamento da finecorsa
while (punto0 ==HIGH) //riposizionamento a punto 0 se il finecorsa non è premuto
{
Serial.println(" azzeramento in corso ");
stepper.move (-200);
delay (1);
punto0 = digitalRead(finecorsa); //controllo stato finecorsa
}
stepper.stop ();
digitalWrite (ledmovimento, LOW); //spegnimento led movimento
Serial.println(" azzeramento eseguito ");
}
void loop()
{
currentMillis = millis();
if ((unsigned long)(currentMillis) > tempinterval+intervallo) { //lettura temperatura ogni 5000 millisecondi
//float h = dht.readHumidity(); //lettura umidita
temp = dht.readTemperature(); //lettura temperatura
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.println(" *C");
tempinterval=millis();
}
{
// codice per fade in su stato MANUALE
if (fadein) {
analogWrite(ledstato, brightness); //imposto uscita con funzione analogica
brightness = brightness + fadeAmount; //aumento luminosità
if (brightness == 0 || brightness == 255) { //diminuzione luminosità
fadeAmount = -fadeAmount ;
}
delay(30);
}
}
if (stato==2) // condizione funzione manuale attivo
fadein=true; // start lampeggio
else
fadein=false; // stop lampeggio
//fine codice fade in
// codice per lampeggio
if (blinking) {
if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { //calcolo tempo per lampeggio anomalia motore
digitalWrite((ledstato), !digitalRead((ledstato))); // led giallo
previousMillis = currentMillis; // sets the time we wait "from"
}
}
int reading = digitalRead(finecorsa); //lettura stato finecorsa
if (reading==HIGH) // condizione a finecorsa non premuto
blinking=true; // start lampeggio
else
blinking=false; // stop lampeggio
//fine codice lampeggio
if (digitalRead(startcentrale)==0 and stato==0) //funzione per effetto relè
{
Serial.println("stato=1"); //stato automatico attivo
stato=1;
}-----------------------------------------------------------------------------------------------------------------
else if (digitalRead(riarmo)==1 and stato!=0)
{
Serial.println("stato=0"); //stato spento attivo
stato=0;
delay(800);
}
else if (digitalRead(riarmo)==1 and statoprec==0) //funzione relè manuale a tempo
{
Serial.println ("stato=2"); //stato manuale temporizzato attivo
stato=2;
delay (1000);
}---------------------------------------------------------------------------------------------------------------
if (stato==1) //accensione
{
if ((digitalRead(finecorsa) ==LOW) && (stato == 1) &&(ledmovimento==LOW))
{
digitalWrite(ledstato, HIGH); //accensione led notifica
}
if (temp<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
if ((stato != statoprec) && stato == 1 && statoprec != 2) //funzione per avviamento motore chiudiporta
{
Serial.print("avviamento motore");
digitalWrite (ledmovimento, HIGH); //accensione led lampeggiante)
stepper.move (20480);
delay (10);
stepper.move (20480);
delay (10);
// stepper.move (20480);
//delay (10);
//stepper.move (10480);
//delay (10);
punto0 = digitalRead(finecorsa); //variabile per battuta finecorsa
while (punto0 ==HIGH) // ritorno fino a pressione finecorsa
{
Serial.println(" ritorno in posizione di riposo ");
stepper.move (-200);
delay (1);
punto0 = digitalRead(finecorsa);
}
stepper.stop ();
digitalWrite (ledmovimento, LOW); //spegnimento led movimento
digitalWrite (ledstato, HIGH); //accensione led stato prenotato
Serial.println(" riposizionamento eseguito ");
statoprec = 1;
}
}
if (stato==0) //riarmo sistema
{
if ((digitalRead(finecorsa) == LOW) && (stato == 0))
{
digitalWrite(ledstato, LOW); //spegnimento led notifica
}
digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
statoprec = 0;
timeout=millis();
}
if (stato==2) //funzione riscaldamento mezza stagione a tempo
{
iniziomanuale=millis();
if (temp<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
if ((unsigned long)(iniziomanuale) > timeout+tempomanuale) //tempo massimo riscaldamento
{
Serial.println(" tempo scaduto ");
stato=0;
timeout=millis();
}
}
if ((stato==2) and digitalRead(startcentrale)==0) //passaggio da manuale ad automatico in caso di "chiamata da remoto"
{
Serial.println ("prenotato");
statoprec= 2;
stato=1;
}
delay (10);// attesa per migliorare la fluidità del programma
}