slimme meter aansturen met arduino nano

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 14
Geregistreerd: 18 Nov 2015, 10:51

slimme meter aansturen met arduino nano

Berichtdoor samboerhoop » 18 Nov 2015, 11:24

Ik heb de volgende slimme meter
http://www.quassi.nl/2015/01/03/read-da ... art-meter/ Protocol DSMR 4.0 115200 baurate

Ben het volgende project aan het maken, voor aansturing van de Home automation controller HC2 van Fibaro.

1. http://blog.hekkers.net/2014/06/15/flex ... n-20-euro/
Als ik deze website lees: kan ik de slimme meter uitlezen, zie toegevoegde tekening en de volgende code kan ik de arduino uitlezen op pin 7 (D07) via de serieele monitor (maar niet via de tcp packet request)

Note: Zie tekening (geen 2K weerstand gebruikt maar een 10K weerstand!

cpp code
// 4 november programmed this below //

/// @dir p1scanner
/// Parse P1 data from smart meter and send as compressed packet over RF12.
/// @see http://jeelabs.org/2013/01/02/encoding-p1-data/
// 2012-12-31 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

// Changed to work with Ethernet shield, 2014-06 Robert Hekkers

#include <SoftwareSerial.h>
//#include <enc28j60.h>
#include <EtherCard.h>
//#include <net.h>

#define DEBUG 1 // set to 1 to use fake data instead of SoftwareSerial
#define LED 1 // set to 0 to disable LED blinking

SoftwareSerial mySerial (7, 17 ,true); // rx, tx, inverted logic
#define NTYPES (sizeof typeMap / sizeof *typeMap)
// list of codes to be sent out (only compares lower byte!)
const byte typeMap [] = {181, 182, 281, 282, 96140, 170, 270, 2410, 2420, 2440};

byte Ethernet::buffer[700];
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
const char website[] PROGMEM = "devbox.hekkers.lan";
uint8_t hisip[] = { 10,0,1,170 };
Stash stash;

byte type;
uint32_t value;
uint32_t readings[NTYPES+1];

static bool p1_scanner (char c) {
switch (c) {
case ':':
type = 0;
value = 0;
break;
case '(':
if (type == 0)
type = value; // truncates to lower byte
value = 0;
case '.':
break;
case ')':
if (type)
return true;
break;
default:
if ('0' <= c && c <= '9')
value = 10 * value + (c - '0');
}
return false;
}

static void collectData (bool empty =false) {
if (!empty) {
for (byte i = 0; i < NTYPES; ++i) {
Serial.print("@ ");
Serial.print(typeMap[i]);
Serial.print('=');
Serial.println(readings[i]);
}
byte sd = stash.create();
stash.print("0,");
stash.println(millis() / 1000);
for (byte i = 0; i < NTYPES; ++i) {
stash.print(typeMap[i]);
stash.print(",");
stash.println(readings[i]);
}
stash.save();
// generate the header with payload - note that the stash size is used,
// and that a "stash descriptor" is passed in as argument using "$H"
Stash::prepare(PSTR("GET http://$F/p1/ HTTP/1.0" "rn"
"Host: $F" "rn"
"Content-Length: $D" "rn"
"rn"
"$H"),
website, website, stash.size(), sd);
// send the packet - this also releases all stash buffers once done
ether.tcpSend();
}
}

void setup ()
{
if (DEBUG) {
Serial.begin(115200);
Serial.println("DEBUG Mode - P1 Output Frames");
}

mySerial.begin(115200);
// digitalWrite(7, 1); // enable pull-up
collectData(true); // empty packet on power-up

delay(2000);
if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)
Serial.println( "Failed to access Ethernet controller");
if (!ether.dhcpSetup())
Serial.println("DHCP failed");

ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);

if (!ether.dnsLookup(website)) {
Serial.println("DNS failed");
ether.copyIp(ether.hisip, hisip);
}
ether.hisport = 80;
ether.printIp("SRV: ", ether.hisip);
}

void serialLoop() {
byte c;
while(mySerial.available()){

c = mySerial.read();
if (c > 0) {
//c &= 0x7F;
}
switch (c) {
case '/':
break;
case '!':
collectData();
memset(readings, 0, sizeof readings);
break;
default:
if (p1_scanner(c)) {
for (byte i = 0; i < NTYPES; ++i)
if (type == typeMap[i]) {
readings[i] = value;
break;
}
}
}
}
}

void loop () {
ether.packetLoop(ether.packetReceive());
serialLoop();
}


Alles zover ok

2. http://blog.hekkers.net/2014/06/22/addi ... ibaro-hc2/
Op de volgende pagina van zijn blog zegt hij dat de arduino geen multitasking kan doen en heeft hij de code omgegooid door het volgende toe te voegen:

cpp code
void loop() {
c = mySerial.read();
switch (c) {
case '/':
receiving = true;
...
break;
case '!':
receiving = false;
...
break;
}
...
if(!receiving) {
if (ether.packetLoop(ether.packetReceive())) {
...
ether.httpServerReply(readingsPage());
}
}
}


Nou geeft hij niet de volledige code vrij. vandaar mij volgende vragen:

Hoe kan ik bovenstaande code toevoegen in mijn sketch om de werkend te maken?
Hoe kan ik de dhcp veranderen naar een static ip adres in deze sketch (Static zou 10.0.1.170 moeten worden)

Ethercard library is toegevoegd aan dit project.

Alvast bedankt
Bijlagen
ethercard.zip
ethercard library
(108.4 KiB) 382 keer gedownload
interface.png
tekening slimme meter
interface.png (5.61 KiB) 7903 keer bekeken

Advertisement

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

Re: slimme meter aansturen met arduino nano

Berichtdoor nicoverduin » 18 Nov 2015, 11:54

Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 14
Geregistreerd: 18 Nov 2015, 10:51

Re: slimme meter aansturen met arduino nano

Berichtdoor samboerhoop » 18 Nov 2015, 23:12

Met wat moeite heb ik de Static IP adres werkend. bedankt

1. Hoe kan ik bovenstaande code toevoegen in mijn sketch om de werkend te maken?
2. Hoe kan ik de dhcp veranderen naar een static ip adres in deze sketch (Static zou 10.0.1.170 moeten worden)

Punt 2 werkt nu, nu nog punt 1, het belangrijkste. Wie kan mij helpen? heb niet veel ervaring met arduino!

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

Re: slimme meter aansturen met arduino nano

Berichtdoor nicoverduin » 19 Nov 2015, 09:02

Soms is grote stappen snel thuis de verkeerde oplossing.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 14
Geregistreerd: 18 Nov 2015, 10:51

Re: slimme meter aansturen met arduino nano

Berichtdoor samboerhoop » 19 Nov 2015, 11:21

nicoverduin schreef:Soms is grote stappen snel thuis de verkeerde oplossing.....

Daarom vraag ik ook help om dit op te lossen!!

Gebruikers-avatar
Berichten: 102
Geregistreerd: 26 Okt 2015, 16:07

Re: slimme meter aansturen met arduino nano

Berichtdoor Atwist » 20 Nov 2015, 12:58

Weet niet of het nog van toepassing is maar misschien hier een stukje code voor vaste IP

Code: Alles selecteren
#include <Ethernet.h>
#include <SPI.h>
#include <MemoryFree.h>

// -------------  Nur diese Daten entsprechend anpassen! -----------------------


byte mac[] =     { 0x18, 0xA2, 0x4C, 0xB5, 0xE0, 0x3D };// MAC-Adresse Arduino (kann so bleiben)
byte ip[] =      { 192, 168, 1, 176 };                  // IP-Adresse Arduino
byte gateway[] = { 192, 168, 1, 244 };                  // IP-Adresse Router
byte subnet[] =  { 255, 255, 255, 0 };                  // Subnet-Maske Netzwerk

EthernetServer server = EthernetServer(80);             // port 80 (kann so bleiben)
Ik ben niet de slimste maar doe wel mijn best.
Andreas

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

Re: slimme meter aansturen met arduino nano

Berichtdoor nicoverduin » 20 Nov 2015, 14:03

Hij gebruikt een andere ethernet chip. Overigens zal in deze context er niets veranderen. Daar ontbreken nog wat statements voor.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten