Arduino Uno e Blynk

Buonasera, innanzi tutto spero sia la sezione giusta per postare il mio quesito.
Sto realizzando il monitoraggio della produzione fotovoltaica (tramite TA) dell’impianto di casa da 6 kW, e voglio visualizzare su smartphone (tramite Blynk) tale produzione.
Per fare questo ho utilizzato Arduino Uno con la ethernet shield. Funziona tutto, ma, come indicato nel sito di Blynk, affinché questo non perda la connessione con lo smartphone, nel Void Loop deve essere presente solo Blynk.run e timer.run impedendomi di inserire monitoraggio della produzione fotovoltaica.
Mi spiego meglio, il progetto risulta funzionante… lettura della potenza prodotta, connessione stabile tra Blynk e smartphone, ma non potendo inserire nel Void Loop la parte di Skethc che monitora la produzione, questa viene letta solo al caricamento dello Skethc e poi basta.
Vi chiedo un aiuto per risolvere questo problema, sono partito da zero da autodidatta risolvendo tutti i problemi che i presentavano, ma questo non riesco proprio >:(
Grazie in anticipo!!!

online_data_connessione.ino (4.66 KB)

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ciao! Non conosco blynk ma mi sembra che puoi inserire il tuo codice nel loop().
Capisci che avere un app che comunica con arduino, ma che arduino non può eseguire un programma sarebbe veramente poco utile.
Io credo che puoi inserire nel loop il tuo programma di monitoraggio.

Leggendo in rete informazioni sull'app blunk, ho visto che è possibile inserire codice all'interno del loop(), poi la libreria blynk ha della funzioni specifiche prestabilite per determinati scopi, come l'esecuzione di codice in intervalli di tempi regolari.

Qui un link con qualche esempio
https://www.filoconnesso.it/blynk-leggere-e-scrivere-i-valori/

Comunque se la documentazione per creare l'interfaccia dell'applicazione è sufficiente, per quanto riguarda la programmazione risulta carente e superficiale.

Buonasera torn24!
Io ho seguito le istruzioni indicate nel sito di Blynk dove appunto spiegano la necessita, in caso di un progetto che preveda l'invio costante di dati da un sensore, di avere solo Blynk.run e timer.run nel void loop.
Per essere il più preciso possibile, di seguito inserisco il link dove puoi trovare le informazioni che chiariscano il motivo di avere il void look "vuoto".

Grazie 1000 per l'aiuto!!

babe8819

Dicono solo che non devi mandare dati a raffica, a ogni giro di loop!

Nella documentazione è presente la funzione BLYNK_READ() , quando l'applicazione blynk deve leggere dati dal dispositivo arduino in questo caso.

Adesso non sappiamo come è implementata la libreria, cioè che differenza può esserci da inviare dati nel loop() o inviarli dalla funzione BLYNK_READ(), magari è progettata per leggerli con intervalli di tempo superiori a quelli del loop(), ma è solo un ipotesi.

BLYNK_READ(V5) // tra parentesi metti il pin virtuale del tuo oggetto sull' app
{
  // This command writes Arduino's uptime in seconds to Virtual Pin V5
  Blynk.virtualWrite(5, millis() / 1000); //numero pin virtuale e valore
}

babe8819:
Mi spiego meglio, il progetto risulta funzionante... lettura della potenza prodotta, connessione stabile tra Blynk e smartphone, ma non potendo inserire nel Void Loop la parte di Skethc che monitora la produzione, questa viene letta solo al caricamento dello Skethc e poi basta.

Non conosco Blynk (e non la userei), ma leggendo la pagina che hai linkato, mi sembra di capire che la parte di monitoraggio ed invio dei dati la devi inserire in una funzione, ad esempio:

void myTimerEvent()
{
  sensorData = analogRead(A0);
  Blynk.virtualWrite(V5, sensorData);
}

e questa viene richiamata da un timer ogni n secondi, come definito ne Setup()

void setup()
{
  //...
  timer.setInterval(1000L, myTimerEvent); //ogni 1 secondo
}

quindi nel Loop devi sono richiamare il timer.

Tutto questo per evitare di inviare dati in continuo, che porterebbe alla disconnessione da parte del loro server (attacco DDoS :wink: )!
In generale il discorso non è diverso dal'uso di millis per fare letture ogni n secondi,solo che qui viene usato un timer con una funzione di callback.

Federico

La differenza è che la funzione void myTimerEvent() decidi tu l'intervallo di tempo, con la funzione BLYNK_READ() usa un tempo prestabilito.

Ho pensato anch’io di utilizzare BLYNK_READ() oppure timer.setInterval, ma (mi scuso per non averlo specificato prima) per il mio progetto ho scelto di utilizzare un sensore TA SCT-013-030 (ecco il link con la descrizione Learn | OpenEnergyMonitor) dove per poterlo utilizzare nello sketch utilizzo le apposite librerie indicate dal fornitore, quali "restituiscono già il valore in Ampere e non il valore letto dal sensore, ma sopratutto non saprei come fare ad “interfacciarle” con le funzioni BLYNK_READ() o timer.setInterval.

babe8819

Ciao! Io non vedo nessun problema :slight_smile:
Tu hai delle librerie per gestire il sensore, all'interno della funzione BLYNK_READ() puoi mettere il codice di lettura del sensore, cioè usare le funzioni di libreria. Nella funzione esegui la lettura del valore e invii i dati all'app blynk. Tutto questo verrà fatto ad intervalli di qualche secondo.

Se dovresti avere la necessità di aggiornare ogni secondo, userai allo stesso modo la funzione myTimerEvent().

In pratica all'interno di queste funzioni puoi mettere tutto il codice che vuoi come se fossi nella funzione loop(), poi come ultima istruzione invii i valori all'applicazione. Ciò che cambia che non viene eseguito continuamente come nel loop(), ma con intervalli di tempo.

Io uso Blink per fare quello che stai facendo tu e ti posso dire che nel loop ci puoi mettere anche altro codice che non sia legato alla comunicazione di dati da e verso il server Blynk (sia che usi quello fornito da loro che uno eventualmente locale) Ovviamente a quanto appena detto bisogna ggiungere che un Arduino uno non ha una enorme potenza di calcolo e quindi, banalmente, piu cose gli fai fare e più potrebbe "perdere colpi"... :slight_smile: Io dopo un primo inizio con Arduino sono passato a ESP8266 (modulo WEMOS D1) che dispone di più potenza di fuoco :slight_smile: pur non avendo molti IO disponibili e per di piu a 3.3v massimi.