Compatibilità tra Arduino uno e Arduino M0 Pro

Buona sera a tutti. Ho un problema di non facile soluzione. Sto cercando di creare un analizzatore di energia / rete dove Arduino mi deve calcolare la corrente istantanea, la potenza istantanea, la potenza media oraria e farmi anche da contabilizzatore di energia. In aggiunta ho integrato anche un rtc ds3231. Fino a qui tutto bene programmando un Arduino uno. Il problema nasce quando, oltre a tutto quello elencato, ho integrato una shield ethernet con lettore di memorie sd, e un trasmettitore rf24. Purtroppo Arduino uno ha poca memoria, così ho pensato di adottare un Arduino M0 Pro. Adattando la base del vecchio programma sul M0, questo gira molto ma molto lentamente e non riesco a capire il perche visto che impiega un processore arm. Domani vi posto lo sketch. Buona serata.

Mi raccomando ... come da REGOLAMENTO, punto 15 e suoi sottopunti, NON si parla di nulla che va oltre la "bassissima tensione" quindi ... niente domande su collegamenti con la rete o argomenti che coinvolgono trensioni di rete. :wink:

Guglielmo

Buon giorno a tutti. Ecco il cuore dello scratch caricato in un Arduino UNO. (usa la libreria "EmonLib").

#include <SPI.h>
#include <LCD5110_Graph.h>
#include "EmonLib.h" 
#include <avr/dtostrf.h>   

#define WINDOW 15
#define DELTA 1500

EnergyMonitor emon1; 

double sIrms;
float Pcur;
float Pmax;
float Pmin=100; 

LCD5110 myGLCD(13,11,5,6,3);

extern uint8_t SmallFont[];

unsigned long measureTime;
boolean flag=false;
double delta=0;

#define DELTAMEASURE 30000

void setup(void)
{
 myGLCD.InitLCD(70);
 myGLCD.setFont(SmallFont);

 myGLCD.update();
 
 emon1.current(0, 75.1);             // Current: input pin, calibration.
 double Irms[WINDOW];
 // Calibrate (find offset)
 double cIrms = 0;
 flag = false;
 
 while (!flag) {
   myGLCD.print("calibrating", 0, 0);
   myGLCD.update();
   Irms[0] = emon1.calcIrms(1480); // the first value in the measurement obviously "crooked"
     //Serial.println("calculate delta");
     for (int i=0; i<WINDOW; i++) {
       Irms[i] = emon1.calcIrms(1480);
       cIrms = cIrms + Irms[i];
       delay(100);
     }
     delta = cIrms/WINDOW;
     flag = true;
 }

myGLCD.print(" ready", 0, 0);
delay(1500);
     myGLCD.clrScr();   

}

void loop(void)
{
 // write the current value
 sIrms = emon1.calcIrms(1480) - delta;  // Calculate Irms only
 sIrms = abs(sIrms);
 Pcur = sIrms*0.220;
 
   // the received data is printed
   char tbuf[6];
   dtostrf(Pcur,5,5,tbuf);
   myGLCD.print(tbuf, 0, 0);
   dtostrf(analogRead(A3),4,0,tbuf);
   myGLCD.print(tbuf, 30, 15);
 
   myGLCD.update();
   
   delay(250);
 
}

Ho dovuto usare anche la libreria <avr/dtostrf.h> in quanto l'Aurduino M0 non riconosce la funzione "dtostrf". Fino a qui tutto bene, il programma si carica ma, nel caso di Arduino M0, il display mostra un valore di potenza sempre fisso anche in assenza di corrente. Questo non succede con Arduino UNO. Perché con l'M0 si? Dove sbaglio? Vi ringrazio.

Dalle prove effettuate risultano queste informazioni:

Arduino UNO Pcur = 0,00xxx analogRead(A3) = 891
Arduino M0 Pcur = 0,31xxx analogRead(A3) = 1023

La mia domanda è perché queste differenze?
Ringrazio.

Io suppongo perché le 2 schede hanno 2 totalmente diversi Controller.

sei sicuro che le librerie
#include <LCD5110_Graph.h>
#include "EmonLib.h"
funzionano con la M0Pro?
ciao Uwe

>bombenm: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (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

La libreria emonlib è pesantissima: fai un test e disattivala, disattivando anche le chiamate, e vedi come tutto si trasforma e Arduino torna ad essere...Arduino. Ho calcolato che il programma viene eseguito solo due o tre volte al secondo !!!

Ringrazio tutti per avermi risposto.

Per qunto riguarda la compatibilità della librerie:

  1. #include <LCD5110_Graph.h>; si sono assolutamente sicuro che è compatibile con la scheda M0.
  2. #include "EmonLib.h" : pensavo di si, ma non ne sono piu' tanto sicuro a questo punto.

In effetti la libreria EmonLib.h è davvero pesantissima ed occupa circa il 60% della memoria di Arduino UNO.

Mi scuso con il Sig. Gulielmo (l'Amministratore di questo forum) per non aver editato prima il mio post.

Buona domenica e grazie.

bombenm:
Mi scuso con il Sig. Gulielmo (l'Amministratore di questo forum) per non aver editato prima il mio post.

... ma invece di scusarti ... non potevi editarlo come ti ho detto al post #5 ? ? ? :o ... bastano 30 secondi !!!

Resto in attesa di vederlo sistemato ... e NON saranno tollerate altre risposte prima che detto post non sia stato sistemato.

Guglielmo