Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Codice bloccante Blynk

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

1
voti

[21] Re: Codice bloccante Blynk

Messaggioda Foto UtentedrGremi » 20 feb 2021, 0:01

TheMask ha scritto:Postare l'intero FW mi viene difficile perché sono 20 moduli compreso il main

Con git non penso potresti avere problemi visto che si condividono miliardi di righe di codice, dalle librerie QT al kernel linux :D
Poi come vuoi, meno codice si controlla e meno suggerimenti ricevi.

Comunque per quanto riguarda lo scheduler se vuoi avviare un task ogni certo tempo devi salvare i millisecondi prima di avviare il task, infatti così ti perdi un tempo di esecuzione task ogni volta. Potrebbe comunque non essere importante.

TheMask ha scritto:Le temperature vanno da 22°C a 30°C perché?

Sono le temperature dell'acqua di un acquario? La campioni ogni 3 secondi? Quanto è il \tau del sistema? Una vasca d'acqua possiamo assimilarla ad un sistema del 1° ordine.

TheMask ha scritto:se sbaglia il 100ms a contare mi sballa gli step e arriva o prima o dopo al duty=10%

Il metodo non mi piace. Hai l'orario no? Scrivi una funzione che dato l'orario fornisce immediatamente il duty cycle da restituire. Anche perché non credo che in 6 secondi puoi notare la differenza di illuminazione (la funzione è sicuramente a lenta variazione). Se l'aggiornamento della luminosità non è costante nel tempo non dovresti notare differenze purché sia fornito ogni volta il valore corretto da impostare.

Altra cosa, ma questa è una chicca, non mi risulta l'ATmega328 supporti il calcolo float. Quindi ogni volta che usi un float il calcolo viene simulato con degli interi. Può essere molto esoso quindi in funzioni con molte operazioni matematiche usa gli interi, devi farti un conto sulle cifre significative utili e poi tronchi alla fine.
Avatar utente
Foto UtentedrGremi
546 2 8
Frequentatore
Frequentatore
 
Messaggi: 280
Iscritto il: 20 nov 2019, 19:49

0
voti

[22] Re: Codice bloccante Blynk

Messaggioda Foto UtenteTheMask » 20 feb 2021, 13:33

nicsergio ha scritto:Io nell'UpdateScheduler(), all'esecuzione di un task, prima memorizzerei il tempo di riferimento per l'esecuzione successiva, poi eseguirei il task.

Per il fade non mi baserei sul numero di step, ma memorizzerei ad esempio in fadeStart il tempo di partenza con millis() nel momento in cui si entra nella finestra di regolazione (Hours >= 7) e calcolerei il fade in funzione di (millis()-fadeStart).


Effettivamente hai ragione non me ne sono accorto. Ad ogni modo provo a riscrivere il FW con la sola lettura della temperatura usando i Timer di Blynk anche se non mi piace per niente, per vedere cosa capita.

Sono le temperature dell'acqua di un acquario? La campioni ogni 3 secondi? Quanto è il \tau del sistema? Una vasca d'acqua possiamo assimilarla ad un sistema del 1° ordine.

Si esatto..non mi sono messo a fare calcoli ma \tau dovrebbe essere circa 10 visto che la temperatura a seguito di un cambiamento si assesta dopo 30min...

Altra cosa, ma questa è una chicca, non mi risulta l'ATmega328 supporti il calcolo float. Quindi ogni volta che usi un float il calcolo viene simulato con degli interi. Può essere molto esoso quindi in funzioni con molte operazioni matematiche usa gli interi, devi farti un conto sulle cifre significative utili e poi tronchi alla fine.
é un ATMEGA2560-15AU però comunque visualizzo unicamente il float e non faccio calcoli in float.
Avatar utente
Foto UtenteTheMask
55 5
Frequentatore
Frequentatore
 
Messaggi: 102
Iscritto il: 14 gen 2015, 16:05

0
voti

[23] Re: Codice bloccante Blynk

Messaggioda Foto UtentedrGremi » 20 feb 2021, 14:13

TheMask ha scritto:Si esatto..non mi sono messo a fare calcoli ma \tau dovrebbe essere circa 10 visto che la temperatura a seguito di un cambiamento si assesta dopo 30min...

Allora penso proprio puoi rilassare le caratteristiche del sistema. Un monitoraggio della temperatura ogni 3 secondi è eccessivo. Dipende da quanto è potente la resistenza puoi campionare un po' di più in fase di riscaldamento.

L'update scheduler potresti avviarlo tramite interrupt gestito da timer. Vedi quali (e se) ne hai di liberi con le librerie che hai utilizzato :ok:
Avatar utente
Foto UtentedrGremi
546 2 8
Frequentatore
Frequentatore
 
Messaggi: 280
Iscritto il: 20 nov 2019, 19:49

0
voti

[24] Re: Codice bloccante Blynk

Messaggioda Foto UtenteTheMask » 22 feb 2021, 13:14

Allora ho fatto la prova utilizzando i Timer di Blynk e come immaginavo ho lo stesso risultato di prima...
Il codice usato è questo
Codice: Seleziona tutto
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include "TempSense.h"

#define LEDTEST 6    //Relay n°8
#define EspSerial Serial1
#define ESP8266_BAUD 115200

char auth[] = "xxxxxxxxx";
char ssid[] = "xxxxxxxxx";
char pass[] = "xxxxxxxxx";

int ledState = 0;
byte ConsentRead = 1;
extern float TempSensor1, TempSensor2;  //External variables of two sensors DS18B20

ESP8266 wifi(&EspSerial);

BlynkTimer timer;

void ConvertReadSensors()
{
  if (ConsentRead == 1)
  {
    ConvertTemperatureSensor1();
    ConvertTemperatureSensor2();
    ConsentRead = 0;
  }
  else
  {
    ReadTemperatureSensor1();
    ReadTemperatureSensor2();
    ConsentRead = 1;
  }
}

void ShowSensors()
{
  Blynk.virtualWrite( V0, TempSensor1);
  Blynk.virtualWrite( V1, TempSensor2);
}

void Led100Test()
{
  ledState = !ledState;
  digitalWrite(LEDTEST, ledState);
}

void setup()
{
  Serial.begin(115200);

  pinMode(LEDTEST, OUTPUT);

  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  Blynk.begin(auth, wifi, ssid, pass);

  timer.setInterval(100L, Led100Test);
  timer.setInterval(1000L, ConvertReadSensors);
  timer.setInterval(3000L, ShowSensors);
}

void loop()
{
  Blynk.run();
  timer.run();
}


In pratica il risultato sul LedTest è questo:
Immagine.png
Avatar utente
Foto UtenteTheMask
55 5
Frequentatore
Frequentatore
 
Messaggi: 102
Iscritto il: 14 gen 2015, 16:05

0
voti

[25] Re: Codice bloccante Blynk

Messaggioda Foto UtentedrGremi » 22 feb 2021, 13:28

Dai uno sguardo agli interrupt http://www.gammon.com.au/interrupts
Controlla che hai il timer2 libero e aggancia un interrupt a lui. Setti il prescaler e ti crei lo scheduler nell'ISR.

Ma il punto è
TheMask ha scritto:risultato sul LedTest è questo

Perché sarebbe un problema?
Avatar utente
Foto UtentedrGremi
546 2 8
Frequentatore
Frequentatore
 
Messaggi: 280
Iscritto il: 20 nov 2019, 19:49

0
voti

[26] Re: Codice bloccante Blynk

Messaggioda Foto UtenteTheMask » 22 feb 2021, 14:33

E' un problema perché alcune volte mi incrementa la variabile ogni 100ms mentre altre volte ogni 625ms.
Se gli step fossero corretti (quindi ogni 100ms) la variabile dovrebbe valere 36000 dopo 1 ora
Con il grafico sopra non sarà più 36000 ma inferiore
Avatar utente
Foto UtenteTheMask
55 5
Frequentatore
Frequentatore
 
Messaggi: 102
Iscritto il: 14 gen 2015, 16:05

0
voti

[27] Re: Codice bloccante Blynk

Messaggioda Foto UtentedrGremi » 22 feb 2021, 17:25

Ma non é affatto un problema. Hai capito come fare per correggere il codice?
Avatar utente
Foto UtentedrGremi
546 2 8
Frequentatore
Frequentatore
 
Messaggi: 280
Iscritto il: 20 nov 2019, 19:49

0
voti

[28] Re: Codice bloccante Blynk

Messaggioda Foto UtenteTheMask » 22 feb 2021, 19:02

drGremi ha scritto:Ma non é affatto un problema. Hai capito come fare per correggere il codice?


No non ho capito perché non è affatto un problema #-o
Avatar utente
Foto UtenteTheMask
55 5
Frequentatore
Frequentatore
 
Messaggi: 102
Iscritto il: 14 gen 2015, 16:05

3
voti

[29] Re: Codice bloccante Blynk

Messaggioda Foto Utentenicsergio » 22 feb 2021, 22:06

Forse non ho capito bene io quello che devi fare, ma a mio avviso la soluzione è semplice, ho tentato di proportela al post [20] ed anche Foto UtentedrGremi al post successivo.

Devi interpolare una funzione lineare, la tua implementazione si fonda sul fatto che l'intervallo di esecuzione sia estremamente regolare, per cui hai una funzione che calcola il duty cycle in funzione del numero di intervalli, ponendo che ogni intervallo sia di 100ms fissi.
La situazione teorica sarebbe la seguente:



Ogni piccolo errore temporale nell'esecuzione va ad accumularsi, per cui alla fine ti scosti via via sempre di più dal comportamento atteso, ottenendo una cosa di questo tipo:



Ora, puoi arrovellarti usando gli interrupts (attenzione che se poi nel codice fai uso della funzione millis() questa interrompe brevemente gli interrupts) oppure semplicemente modificare la funzione del calcolo del duty cycle, dimenticando il counter degli intervalli e dandole in pasto direttamente il tempo attuale.
In questo modo calcoli il valore corretto corrispondente all'istante di esecuzione, anche se l'intervallo di aggiornamento non è regolare:

Avatar utente
Foto Utentenicsergio
1.085 3 11
Expert
Expert
 
Messaggi: 125
Iscritto il: 1 gen 2020, 16:42

1
voti

[30] Re: Codice bloccante Blynk

Messaggioda Foto UtenteTheMask » 23 feb 2021, 0:58

Ciao questo si mi è chiaro ed infatti già al tuo post mi era venuto in mente di implementarlo però poi mi sono chiesto un’altra cosa se non avessi RTC come potrei fare? Cioè ammettiamo di voler accendere e spegnere un led ogni 100ms bene con Blynk non c’è modo di farlo avrai sempre dei tempi più lunghi o più corti perché quella funzione (Blynk.virtualwrite)... accumula un ritardo. Se andiamo a vedere come è fatta la funzione all’interno ha un bel while che attende la ricezione di un comando che deve arrivare entro un certo timeout. Se tu invece elimini ogni funzione relativa al virtualwrite hai un segnale pulitissimo a 5Hz
Avatar utente
Foto UtenteTheMask
55 5
Frequentatore
Frequentatore
 
Messaggi: 102
Iscritto il: 14 gen 2015, 16:05

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti