Come temevo tutto il resto del programma è "incompatibile", a partire dalle letture dei DHT che portano via almeno 3 secondi ad ogni ciclo di loop 
Si può certamente riscrivere la regolazione dell'apertura sotto forma di macchina a stati (attivata da un flag regAp) da richiamare continuamente dalla loop:
...ma anche tutto il resto dovrebbe essere riscritto in questo modo. Inoltre i tempi di esecuzione della regolaApertura possono risultare allungati dai tempi delle altre funzioni (letture dei DHT in primis).
@Claudio_FF: ho provato ad apportare le tue modifiche, provvedendo opportunamente a creare due funzioni (una per l'apertura ed una per la chiusura) al posto di "regolaApertura()" però non fa ciò che deve.
Il mio codice deve alzare od abbassare la tenda tramite il comando di una slide bar ricevuto da un'app sviluppata per Android.
Se applico il tuo codice mi funziona solo in chiusura (abassare la tenda) ovvero, solo se trascino la slide bar oltre la percentuale di apertura attuale. Se invece voglio alzarla non mi funziona.
Inoltre se ho per esempio la tenda abbassata del 10% e la comando di portarsi al 60% per esempio, non si ferma alla posizione impostata desiderata ma solo quando arriva a fine corsa ovvero al 100%.
E' come se non considerasse la funzione StampaApertura()
Ti allego il codice che ho dovuto opportunamente modificare per poter scindere le operazioni di apertura e chiusura.
void AlzoTenda()
{
static byte stato = 0;
static uint32_t t_time;
switch(stato)
{
case 0:
if(regAp) {
digitalWrite(RCH2, LOW);
t_time = millis();
stato = 1;
}
break;
case 1:
if(millis() - t_time >= 1800) {
digitalWrite(RCH2, HIGH);
stato = 2;
}
break;
case 2:
StampaApertura(); // legge l'apertura
if(value_int >= Apertura) {
digitalWrite(RCH2, LOW);
t_time = millis();
stato = 3;
}
break;
case 3:
if(millis() - t_time >= 250)
{
digitalWrite(RCH2, HIGH);
stato = 0;
regAp = false;
}
}
}
void AbbassoTenda()
{
static byte stato = 0;
static uint32_t t_time; //timer tenda
switch(stato)
{
case 0:
if(regAp) {
digitalWrite(RCH1, LOW);
t_time = millis();
stato = 1;
}
break;
case 1:
if(millis() - t_time >= 1800) {
digitalWrite(RCH1, HIGH);
stato = 2;
}
break;
case 2:
StampaApertura(); // legge l'apertura
if(value_int <= Apertura) {
digitalWrite(RCH1, LOW);
t_time = millis();
stato = 3;
}
break;
case 3:
if(millis() - t_time >= 250)
{
digitalWrite(RCH1, HIGH);
stato = 0;
regAp = false;
}
}
}
il tutto richiamato nella scheda Json in questo modo:
if (value_int >= 0 && value_int <= 100)
{
if (value_int > Apertura)
{
AlzoTenda();
}
if (value_int < Apertura)
{
AbbassoTenda();
}
}
else
{
Serial.println(F("Valore fuori range"));
client.print(F("Error, value out of range"));
}
Se invece utilizzo questo codice usando però il delay fa esattamente ciò che voglio io.
if (value_int >= 0 && value_int <= 100)
{
if (value_int > Apertura)
{
/*
Serial.print("Apro la tenda da posizione:");
Serial.print(Apertura);
Serial.print("% a posizione:");
Serial.print(value_int);
Serial.print("%");
*/
digitalWrite(RCH2, LOW);
delay(1800); // Attendo 1,8 secondi prima di riposizionare il relè sullo stato iniziale.
//Operazione necessaria per simulare la pressione del tasto altrimenti la centralina non riceve correttamente il comando
digitalWrite(RCH2, HIGH);
while (value_int > Apertura)
{
StampaApertura();
//Serial.println(Apertura);
}
digitalWrite(RCH2, LOW);
delay(250); //Attendo 250 millisecondi prima di riposizionare il relè sullo stato iniziale, altrimenti la centralina non processa correttamente il comando
digitalWrite(RCH2, HIGH);
client.print(F("status ok"));
/*
client.print(value_int);
client.print(",Apertura:");
client.print(Apertura);
*/
}
if (value_int < Apertura)
{
/*
Serial.print("Chiudo la tenda da posizione:");
Serial.print(Apertura);
Serial.print("% a posizione:");
Serial.print(value_int);
Serial.print("%");
*/
digitalWrite(RCH1, LOW);
delay(1800); // Attendo 1,8 secondi prima di riposizionare il relè sullo stato iniziale.
//Operazione necessaria per simulare la pressione del tasto altrimenti la centralina non riceve correttamente il comando
digitalWrite(RCH1, HIGH);
while (value_int < Apertura)
{
StampaApertura();
//Serial.println(Apertura);
}
digitalWrite(RCH1, LOW);
delay(250); //Attendo 250 millisecondi prima di riposizionare il relè sullo stato iniziale, altrimenti la centralina non processa correttamente il comando
digitalWrite(RCH1, HIGH);
client.print(F("status ok"));
/*
client.print(value_int);
client.print(",Apertura:");
client.print(Apertura);
*/
}
}
else
{
Serial.println(F("Valore fuori range"));
client.print(F("Error, value out of range"));
}
Dov'è l'errore?