Go Down

Topic: Ritardo accensione relè (Read 233 times) previous topic - next topic

FabrizioG65

Feb 01, 2019, 07:02 pm Last Edit: Feb 01, 2019, 09:41 pm by FabrizioG65
Ciao a tutti, avrei bisogno di una chiarificazione...
Con Arduino gestisco, via software da PC, 4 relè e 2 sonde di temperatura.
Il tutto funziona ma ho dei ritardi di circa un secondo tra l'invio della stringa sulla seriale da PC e la reazione di Arduino per accendermi i relè.
Chi mi può aiutare?
(allego codice)


Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
#define Pentola 14
#define Boiler 15
OneWire ourWire1(Pentola);
DallasTemperature sensorsPentola(&ourWire1);  
OneWire ourWire2(Boiler);
DallasTemperature sensorsBoiler(&ourWire2);

#define RELAY1  6                    
#define RELAY2  7                        
#define RELAY3  8                        
#define RELAY4  9
String stato = "";
int RelayS =0;
void setup(){    
// Initialise the Arduino data pins for OUTPUT
 Serial.begin(115200);
 pinMode(RELAY1, OUTPUT);      
 pinMode(RELAY2, OUTPUT);
 pinMode(RELAY3, OUTPUT);
 pinMode(RELAY4, OUTPUT);
 sensorsPentola.begin();
 sensorsBoiler.begin();
 digitalWrite(RELAY1,HIGH);
 digitalWrite(RELAY2,HIGH);
 digitalWrite(RELAY3,HIGH);
 digitalWrite(RELAY4,HIGH);
 
}

void loop(){
 
 sensorsPentola.requestTemperatures();
 sensorsBoiler.requestTemperatures();
 Serial.print(sensorsPentola.getTempCByIndex(0));
 Serial.print(",");
 Serial.print(sensorsBoiler.getTempCByIndex(0));
 Serial.println();
 delay(100);
}
void serialEvent() {
 while (Serial.available()) {
   stato = Serial.readString();
   RelayS = stato.toInt();
   switch (RelayS) {
     case 11:
       digitalWrite(RELAY1,LOW);
       break;
     case 21:
       digitalWrite(RELAY2,LOW);
       break;
     case 31:
       digitalWrite(RELAY3,LOW);
       break;
     case 41:
       digitalWrite(RELAY4,LOW);
       break;
     case 10:
       digitalWrite(RELAY1,HIGH);
       break;
     case 20:
       digitalWrite(RELAY2,HIGH);
       break;
     case 30:
       digitalWrite(RELAY3,HIGH);
       break;
     case 40:
       digitalWrite(RELAY4,HIGH);
       break;
     default:
       // statements
     break;
   }
 }
}

gpb01

#1
Feb 01, 2019, 07:15 pm Last Edit: Feb 01, 2019, 07:15 pm by gpb01
>FabrizioG65:   ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà sistemato il post, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. ;)
Search is Your friend ... or I am Your enemy !

MatteoDerrico

Ciao io non userei la libreria String di Arduino ... del perché trovi tanta documentazione anche qui sul forum

Ma bensì non creerei un array di caratteri al posto di una stringa :)

Però per farti un esempio dovresti specificarci cosa mandi, in formato, con che formattazione :)

Anche se penso che tu mandi solo un valore intero che assume determinati valori, giusto?
E sempre di due numeri ?
Oppure quello è parte di un programma più complesso è potresti ricevere altro?

Appena sono chiare queste info posso scriverti alla veloce un programma di esempio per come leggere dalla seriale senza usare la String ;)

MD
Se una scrivania in disordine è segno di una mente disordinata, di cosa sarà segno allora una scrivania vuota?

Standardoil

io invece direi di concentrarsi per prima cosa sui tempi di lettura dei termometri...
750 ms di converiosne, dal datasheet
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

FabrizioG65

Ciao io non userei la libreria String di Arduino ... del perché trovi tanta documentazione anche qui sul forum

Ma bensì non creerei un array di caratteri al posto di una stringa :)

Però per farti un esempio dovresti specificarci cosa mandi, in formato, con che formattazione :)

Anche se penso che tu mandi solo un valore intero che assume determinati valori, giusto?
E sempre di due numeri ?
Oppure quello è parte di un programma più complesso è potresti ricevere altro?

Appena sono chiare queste info posso scriverti alla veloce un programma di esempio per come leggere dalla seriale senza usare la String ;)

MD
Da Arduino devo ricevere diversi valori, per ora solo 2 ma diventeranno 4 o 5.
Per ora leggo solo le temperature di due sensori e invio la stringa in questo formato (17.05,18.20) dove la virgola mi fa da separatore per splittare la stringa. (qui funziona in tempo reale)

Dal PC invio i comandi per On/Off dei 4 relè e ,in futuro,  la regolazione di velocità di 2 motorini e la regolazione di un Servo-Motore.
Es:
10 = OFF relè 1
11  = ON relè 1
20  = OFF relè 2
ecc..

(qui il ritardo è evidente quasi un sec.)

paulus1969

Non conosco il Serial.readString, non lo uso mai... probabilmente attende il timeout della seriale come accade con il parseint.
Prova ad abbassare il timeout della seriale a 100 millisecondi.

FabrizioG65

Non conosco il Serial.readString, non lo uso mai... probabilmente attende il timeout della seriale come accade con il parseint.
Prova ad abbassare il timeout della seriale a 100 millisecondi.

Perfetto era proprio quello!!
GRAZIE  ;)

paulus1969

Abbiamo capito da dove viene quel secondo.

Ma eviterei di lasciare le cose così, i prossimi passi dovrebbero essere:

- eliminare l'uso di String
- migliorare il protocollo di trasmissione


Go Up