Arduino Mega slimme meter uitlezen met Solarmeter Harold65

Arduino specifieke Software
Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 24 Jul 2019, 06:33

Goedemorgen Koepel,

Ik wil jou hartelijk bedanken voor al jouw hulp en alle anderen die mee wouden denken :) Wat in 1e instantie een onmogelijke opgave leek (zeker voor mij) en waar meerdere mensen naar gekeken hebben en geen oplossing konden bieden heb jij die geleverd d.m.v. een extra printje en een goedwerkende sketch de nu al beroemde P1 verslomer om de Mega aan te sturen met de sketch Solarmeter. Zo zie je maar dat er nog steeds mensen zijn die anderen mensen helpen :)

Ik zie geen rare pieken meer in PVOutput doordat de Mega het niet kon bolwerken en er af en toe grote getallen er uitgooide.

Wat betreft de ledjes laten knipperen, dat schud jij zo uit je mouw maar ik snap het niet echt :?

Advertisement

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 25 Jul 2019, 16:59

Koepel,

Komt het er dan zo uit te zien?

Code: Alles selecteren
// P1 poort verslomer
// ------------------
//
// Board
// -----
//   Arduino Leonardo/Micro/Pro Micro of een andere ATmega32U4.
//
// Werking
// -------
//   De 115200 8N1 seriele data van de P1 poort wordt ingelezen op pin 0.
//   Het wordt vertraagd op 9600 baud verstuurd op pin 9.
//
// Versies
// -------
//   Versie 1, 20 juni 2019
//     Eerste versie.
//   Versie 2, 20 juni 2019
//     memset() voor Serial.readBytesUntil() toegevoegd.
//   Versie 3, 25 juli 2019
//     Knipperende leds bij tx en rx
//
//
 
#include <SoftwareSerial.h>
 
SoftwareSerial portSlow( 8, 9);    // RX, TX
 
#define BUFFER_SIZE 1024
 
char buffer[BUFFER_SIZE];
 
void setup()
{
  Serial1.begin( 115200);                    // alleen RX wordt gebruikt
  portSlow.begin( 9600);                     // alleen TX wordt gebruikt
  pinMode( LED_BUILTIN_RX, OUTPUT);
  pinMode( LED_BUILTIN_TX, OUTPUT);
}
 
void loop()
{
  Serial1.setTimeout( 0);
  Serial1.readBytes( buffer, BUFFER_SIZE);   // de RX buffer van de library leegmaken
  Serial1.setTimeout( 15000UL);              // 15 seconden timeout
  Serial1.find( '/');                        // zoek start teken
  memset( buffer, '\0', BUFFER_SIZE);        // buffer leegmaken, dan is er ook meteen een zero terminator.
  Serial1.readBytesUntil( '!', buffer, BUFFER_SIZE);  // lees tot einde van telegram
 
  portSlow.println( buffer);                  // Verstuur langzaam op 9600 baud
 
  delay( 7000);                               // wacht 7 seconden
  digitalWrite( LED_BUILTIN_RX, LOW);  // LOW = aan zetten
}

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 27 Jul 2019, 10:40

Kan iemand mij vertellen of de voorgestelde code van Koepel goed staat in mijn vorige post?
Eerst in setup():
Code:
pinMode( LED_BUILTIN_RX, OUTPUT);
pinMode( LED_BUILTIN_TX, OUTPUT);


En dan bijvoorbeeld:
Code:
digitalWrite( LED_BUILTIN_RX, LOW); // LOW = aan zetten

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor nicoverduin » 27 Jul 2019, 12:31

Maak een test programma bouw het en test het.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 07 Aug 2019, 18:11

De "P1 poort verslomer" heb ik aangepast.
De RX-led gaat aan bij het inlezen (eens per 10 seconden). De led blijft uit als er geen telegram is.
De TX-led gaat aan bij het versturen.
De seriele monitor kan eventueel gebruikt worden om het telegram te bekijken.

Ik heb het getest met een Arduino Leonardo, met de seriële monitor geopend, met de seriële monitor uit, en op een adapter helemaal los van een computer. Dus het lijkt te werken. De kwaliteit van de sketch is: "ik heb slechtere code geschreven" :lol:

cpp code
// P1 poort verslomer
// ------------------
//
// Board
// -----
// Arduino Leonardo/Micro/Pro Micro of een andere ATmega32U4.
//
// Werking
// -------
// De 115200 8N1 seriele data van de P1 poort wordt ingelezen op pin 0.
// Het signaal van de slimme meter moet eerst ge-inverteerd worden.
// Het wordt vertraagd op 9600 baud verstuurd op pin 9.
//
// Versies
// -------
// Versie 1, 20 juni 2019
// Eerste versie.
// Versie 2, 20 juni 2019
// memset() voor Serial.readBytesUntil() toegevoegd.
// Versie 3, 25 juli 2019
// Knipperende leds bij tx en rx
// Versie 4, 7 aug 2019
// De RX-led gaat ongeveer eens per 10 seconden aan als er een telegram wordt ontvangen.
// Het telegram wordt ook naar de seriele monitor gestuurd op 115200 baud,
// zodat de seriele monitor eventueel gebruikt kan worden om het telegram te bekijken.
// Door dat versturen gaat de TX-led ook automatisch even aan.
// Als het telegram vertraagd wordt verstuurd wordt de TX ook aan gezet.
// Als er iedere seconde een telegram binnenkomt, dan wordt er maar eentje per
// 10 seconden verwerkt en de rest wordt overgeslagen.
//

#include <SoftwareSerial.h>

SoftwareSerial portSlow( 8, 9); // RX, TX

#define BUFFER_SIZE 1024

char buffer[BUFFER_SIZE];

void setup()
{
SerialUSB.begin( 115200); // Naar de computer, naar de seriele monitor, zet die op 115200 baud.
// Wacht maximaal 2 seconden totdat de seriele verbinding met de computer gelukt is.
unsigned long t1 = millis();
while( !SerialUSB && millis() - t1 < 2000UL);
SerialUSB.println(F( "P1 poort verslomer"));
SerialUSB.println(F( "Er wordt slechts eens per 10 seconden een telegram ingelezen."));
SerialUSB.println(F( "De andere telegrammen worden overgeslagen."));
SerialUSB.println(F( "Het telegram wordt ter controle hier weergegeven."));
SerialUSB.println();

Serial1.begin( 115200); // alleen RX wordt gebruikt, pin 0, dat is de hardware seriele poort
portSlow.begin( 9600); // alleen TX wordt gebruikt, pin 9, die is traag op 9600 baud
pinMode( LED_BUILTIN_RX, OUTPUT);
pinMode( LED_BUILTIN_TX, OUTPUT);
}

void loop()
{
Serial1.setTimeout( 0);
Serial1.readBytes( buffer, BUFFER_SIZE); // de RX buffer van de library leegmaken
Serial1.setTimeout( 15000UL); // 15 seconden timeout

// De "find()" leest het '/' teken uit de stream. Dat teken is daarmee verdwenen.
if( Serial1.find( '/')) // start teken van telegram gevonden ?
{
// ----------------------------------------------
// Inlezen telegram
// ----------------------------------------------

digitalWrite( LED_BUILTIN_RX, LOW); // Zet RX led aan, LOW is aan

// Bij de "readBytesUntil()" is het niet zeker dat er een zero-terminator gezet wordt.
// Dus dat nog eens extra doen.
// De '!' is het einde van het telegram (daarna komt nog de checksum).
int n = Serial1.readBytesUntil( '!', buffer, BUFFER_SIZE); // lees telegram van pin 0.
if( n < BUFFER_SIZE)
buffer[n] = '\0';
else
buffer[BUFFER_SIZE-1] = '\0';

digitalWrite( LED_BUILTIN_RX, HIGH); // Zet RX led uit, HIGH is uit

// ----------------------------------------------
// Verstuur naar seriele monitor
// ----------------------------------------------

// Ter controle wordt het telegram ook naar de seriele monitor verstuud.
// De checksum wordt niet gecontroleerd.
SerialUSB.print( "/"); // Het verdwenen start teken er weer bij frommelen
SerialUSB.print( buffer); // Naar de seriele monitor op de computer
SerialUSB.print( "!"); // Het verdwenen stop teken er weer bij frommelen
for( int i=0; i<4; i++)
{
SerialUSB.write( Serial1.read()); // Geef ook de checksum door naar de seriele monitor
}
SerialUSB.println();

delay( 500); // Wacht totdat de SerialUSB alles heeft verstuurd en de TX led heeft uitgezet.

// ----------------------------------------------
// Verstuur vertraagd naar pin 9 op 9600 baud
// ----------------------------------------------

digitalWrite( LED_BUILTIN_TX, LOW); // Zet TX led aan, LOW is aan
portSlow.println( buffer); // Verstuur langzaam op 9600 baud op pin 9.
delay( 2000); // Laat de TX led nog twee seconden extra aan
digitalWrite( LED_BUILTIN_TX, HIGH); // Zet TX led uit, HIGH is uit
}

// De waarde van 5500 ms is gekozen om ruim op tijd klaar te staan voor een telegram
// van 10 seconden later. Dat klinkt niet erg betrouwbaar en dat is het dan ook niet.
delay( 5500); // wacht een paar seconden
}

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 07 Aug 2019, 19:33

Wat ben jij toch goed hè, werkt formidabel.
Vraag: Word door dat overslaan van telegrammen wel de juiste waarden doorgegeven?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 07 Aug 2019, 21:35

Ja, want alles wat in de RX-buffer (in de Serial library) zit van vorige telegrammen, maak ik eerst helemaal leeg. Daarna lees ik totdat ik een begin van een nieuw telegram zie. Dan lees ik een volledig telegram in. Volgens mij is daar geen speld tussen te krijgen.

De waarde van de gas-meter en elektriciteit is de totale waarde van dat moment. Dat klopt altijd. Of je nu heel vaak naar de meterstanden kijkt of heel weinig, die meterstanden gaan gewoon hun gang.

Het enige is de actuele waarde (1-0:1.7.0). Die komt dus maar één keer per 10 seconden door, terwijl die informatie iedere seconde aanwezig is.
Ik zou graag zien dat als ik een oven aan zet, dat ik dan uiterlijk 1 seconde later dat op mijn mobieltje dat kan zien. Dat ben ik van plan te maken met een ESP32, gewoon de gegevens inlezen en dat op een webpagina (in de ESP32) laten zien.

Met die ledjes is het inderdaad een stuk prettiger, dan kun je zien dat het allemaal goed loopt.

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 08 Aug 2019, 06:02

Toen de sketch er in zat en aangesloten op de USB en ik keek mee op de monitor dan gaat het ledje eerst van RX naar TX heel snel even aan en uit (in het tempo van The Night Rider). Dan gaat de TX 2 seconden aan en weer uit. Haal ik de USB kabel er af dus ook niet meer mee kijken op de monitor dan gaat alleen RX even kort aan en later RX 2 seconden branden en weer uit. Dus het gaat niet meer van RX naar TX even heel snel. Is dit omdat je niet op je Arduino monitor kijkt?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 08 Aug 2019, 07:03

Ja, dat klopt.

Het TX-ledje en RX-ledje wordt nog steeds aan- en uitgezet (buiten de sketch om) als er iets verstuurd of ontvangen wordt naar/van de seriële monitor. Als ik die ledjes zelf ga gebruiken, dan probeer ik daar tussendoor te fietsen.

Het TX-ledje gaat dus aan (buiten de sketch om) als het telegram naar de seriële monitor wordt verstuurd. Maar het gaat ook weer uit (buiten de sketch om) als dat klaar is ! Daar kan ik verder niets aan doen. Het lukte mij niet om het TX-ledje aan te laten. Dus ik wacht even totdat het uitgezet wordt (buiten de sketch om), zodat ik het daarna zelf twee seconden aan kan zetten.

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 21 Aug 2019, 14:00

Eigenlijk niets meer van Handz gehoord. Ben benieuwd of hij nog gebruik heeft gemaakt van de opstelling met de P1 verslomer?

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 24 gasten