nodo-domotica.nl

Arduino hulp gezocht - crashende arduino

Hier alles over software in combinatie met de Nodo

Arduino hulp gezocht - crashende arduino

Berichtdoor Sjoerdp » 29 dec 2011, 19:41

In afwachting van mijn nodo shield, ben ik alvast gaan experimenteren met mijn nieuwe Arduino Mega en Ethernet shield. Op basis van de meegeleverde voorbeelden had ik binnen de kortste keren een sketch in elkaar dat pulsjes van mijn electriciteitsmeter kan uitlezen en naar Pachube stuurt. Echter, zoals het onderwerp al aangeeft, crasht mijn Arduino steeds na een tijdje. Het lijkt erop dat hij crasht zodra er een interrupt komt (nieuwe puls) tijdens het communiceren via Ethernet. Niet echt fijn dus.

Is er iemand met Arduino kennis die ziet wat ik fout doe?

Ik heb de lichtsensor een tijdje van de electriciteitsmeter afgehaald en dan gaat het wel de hele dag goed. Pas als er pulsjes komen tijdens het verzenden van data of volgens mij ook tijdens het schrijven naar de serial, gaat het mis. Zie bijvoorbeeld deze output van mijn Serial monitor, waarbij ik even elke 10 seconde naar Pachube schrijf om de kans op een puls tijdens het schrijven zo groot mogelijk te maken:

Code: Selecteer alles
<knip lang stuk log>
disconnecting.
Puls!
Puls!
Submit Data
2
connecting...
HTTP/1.1 200 OK
Date: Thu, 29 Dec 2011 17:23:32 GMT
Content-Type: text/html; charset=utf-8
Connection: close
X-Pachube-Logging-Key: (verwijderd)
X-PachubeRequestId: (verwijderd)
Cache-Control: max-age=0
Content-Length: 1
Age: 0
Vary: Accept-Encoding

 
disconnecting.
Puls!
Submit Data
1
connecting...
HTTP/1.1 200 OK
Date: Thu, 29 Dec 2011 17:23:42 GMT
Content-Type: text/html; charset=utf-8
Connect


Halverwege het woord Connection: close is hij dus afgebroken. Ik heb inmiddels ook al een Watchdogtimer toegevoegd, maar ook dat werkt niet. Alhoewel ik daar lees dat ik een andere bootloader nodig zou hebben om dit te kunnen gebruiken. Is dat nog steeds zo met de nieuwe R3 van de Mega 2560?

Hierbij mijn sketch:

Code: Selecteer alles
/*
  Energiepulsjes tellen en doorsturen naar Pachube, op basis van voorbeeld Pachube sensor client
 
 This sketch connects an analog sensor to Pachube (http://www.pachube.com)
 using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
 the Adafruit Ethernet shield, either one will work, as long as it's got
 a Wiznet Ethernet module on board.
 
 Op basis van:

 http://www.tigoe.net/pcomp/code/category/arduinowiring/873
 This code is in the public domain.
 
 */

#include <SPI.h>
#include <Ethernet.h>
#include <avr/wdt.h>

// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// fill in your address here:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x00, 0x8A, 0xCA};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(10,0,0,200);
// initialize the library instance:
EthernetClient client;

long lastConnectionTime = 0;        // last time you connected to the server, in milliseconds
boolean lastConnected = false;      // state of the connection last time through the main loop
const long postingInterval = 10000;  //delay between updates to Pachube.com

volatile int state = LOW;
const int  sensorPin = 3;    // Light sensor that monitors LED pulses from energy meter
const int  detectLedPin =  4;  // LED indicating that sensor data is received. Toggles at every pulse
const int  submitLedPin = 5;  // LED indicating data is being submitted.

const int logInterruptPin = 1; // interrupt 0 = pin 2, 1 = pin 3
const int interruptPin = 3; // Pin in use for sensorPin

volatile unsigned long wattSensor = 0;  // Counts power pulses in interrupt routine, 1 pulse = 2 watt
unsigned long totalWatts = 0;  // Total power used since the sketch started (not in use)

void setup() {
  wdt_enable(WDTO_8S); // Reset board after 8 seconds without watchdog reset

  // start serial port:
  Serial.begin(9600);
 
  pinMode(sensorPin, INPUT);     
  //digitalWrite(sensorPin, HIGH);
  attachInterrupt(logInterruptPin, pulsInterrupt, FALLING);  // Generate interrupt after pulse from energy meter
 
  pinMode(detectLedPin, OUTPUT);
  pinMode(submitLedPin, OUTPUT);
 
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the ethernet module time to boot up:
  delay(1000);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Configure manually:
    Ethernet.begin(mac, ip);
  }
  //Serial.println(mac);
  Serial.println(ip);
  Serial.println("Arduino boot completed . . . .");
}

void loop() {
 
  wdt_reset(); // reset watchdog timer
 
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
 
 // blink the LED to show meter pulses
  digitalWrite(detectLedPin, state);

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    digitalWrite(submitLedPin, HIGH); // Show with LED that data is being submitted
    unsigned long wattSensorCount; //number of watts during this logging interval
    uint8_t oldSREG = SREG;   // save interrupt register
    cli();                    // prevent interrupts while accessing the count   
    wattSensorCount = wattSensor; //get the count from the interrupt handler
    wattSensor = 0;           //reset the watts count
    SREG = oldSREG;           // restore interrupts
    Serial.println("Submit Data");
    Serial.println(wattSensorCount); // Debug information
    sendData(wattSensorCount);
    digitalWrite(submitLedPin, LOW); // Turn off LED that is indicating that data is being submitted
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(int thisData) {
  // if there's a successful connection:
  if (client.connect("www.pachube.com", 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request.
    // fill in your feed address here:
    client.print("PUT /api/<knip>.csv HTTP/1.1\n");
    client.print("Host: www.pachube.com\n");
    // fill in your Pachube API key here:
    client.print("X-PachubeApiKey: <knip>");
    client.print("Content-Length: ");

    // calculate the length of the sensor reading in bytes:
    int thisLength = getLength(thisData);
    client.println(thisLength, DEC);

    // last pieces of the HTTP PUT request:
    client.print("Content-Type: text/csv\n");
    client.println("Connection: close\n");

    // here's the actual content of the PUT request:
    client.println(thisData, DEC);

    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
  }
}


// This method calculates the number of digits in the
// sensor reading.  Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
  // there's at least one byte:
  int digits = 1;
  // continually divide the value by ten,
  // adding one to the digit count for each
  // time you divide, until you're at 0:
  int dividend = someValue /10;
  while (dividend > 0) {
    dividend = dividend /10;
    digits++;
  }
  // return the number of digits:
  return digits;
}


void pulsInterrupt() // routine called when external interrupt is triggered due to flash from Energy Meter
{
  Serial.println("Puls!");
  state = !state;
  wattSensor = wattSensor + 1;  //Update number of pulses, 1 pulse = 1 watt
}



Uiteindelijk is mijn doel om dit te combineren met de NODO, zodat hij ook mooi mijn energieverbruik in de gaten kan houden. Maar als het zelfstandig al niet draait, begin ik nog maar niet aan integreren....

Heeft iemand enig idee waarom dit steeds crasht? Ik weet vrij zeker dat dit met de afhandeling van interrupts te maken heeft, maar wat precies....
Sjoerdp
 
Berichten: 106
Geregistreerd: 01 okt 2011, 17:20

Re: Arduino hulp gezocht - crashende arduino

Berichtdoor Paul » 01 jan 2012, 21:02

Ik vind het een leuk project. Ik neem in overweging om de WiredIn ook te koppelen met Pachube. wellicht is het een idee om je code/project niet in de Nodo te willen integreren, maar te laten samenwerken. Je hoeft alleen een 433Mhz routine te maken (slopen uit de Nodo Software) die de pulswaarden naar de Nodo verzend via RF. Voordeel is dat je de lastige integratie in de Nodo software achterwege kan laten en het ook heel goedkoop en eenvoudig op kunt zetten. Een heel klein Arduinootje bv. met een ATMega168 en een 433 zender en klaar.

Dan wil in wel kijken hoe data van deze kleine "satelieten" kan worden opgevangen met de Nodo met ethernet funktionaliteit. waarna je vervolgens er mee kan doen wat je wilt. Dit maakt het ook modulairder en beter uitbreidbaar.
Groeten Paul
Paul
 
Berichten: 1152
Geregistreerd: 31 aug 2011, 20:33

Re: Arduino hulp gezocht - crashende arduino

Berichtdoor Paul » 03 jan 2012, 07:37

Als je kijkt naar de volgende link...

http://community.pachube.com/arduino/ethernet/watchdog

...dan kun je lezen dat het allemaal nogal buggy is. Het feit alleen al dat er een WDT moet draaien geeft aan dat dit ook onderkend wordt. Ik neem aan dat er nog wel wat ontwikkelingen zullen zijn die maken dat het wel stabiel gaat werken.

Ik heb een Pachube connectie voor de Nodo op de wishlist gezet.

http://code.google.com/p/arduino-nodo/issues/detail?id=230&colspec=ID%20Type%20Status%20Part%20Priority%20Found%20Summary%20Owner%20Fixed

Ik ga zeker niet omwille van vastlopers Nodo gebruikers op het spoor zetten dat zij een nieuwe bootloader moeten installeren. Dus in de eerstkomende release zul je het helaas nog niet vinden.

Wordt vervolgd...
Groeten Paul
Paul
 
Berichten: 1152
Geregistreerd: 31 aug 2011, 20:33

Re: Arduino hulp gezocht - crashende arduino

Berichtdoor Sjoerdp » 03 jan 2012, 21:41

@Paul: Super dat je er naar gaat kijken. Ik ben er inderdaad ook achter gekomen dat alles nogal buggy is. Dat is erg jammer. Ik heb inmiddels weer een hoop aanpassingen gemaakt (waaronder niet de pulsen tellen, maar juist de tijd dat het duurt voordat er 5 pulsen zijn), waardoor de nauwkeurigheid nog een stuk vergroot is. Ook Watchdog timers en dergelijke toegevoegd, maar die lijken helaas niet te helpen. Als het crasht, reset hij ook niet meer. Ik moet me er dus nog verder in gaan verdiepen.

Jouw idee van informatie via 433MHz aanleveren aan de Nodo staat me wel aan. Daar ga ik ook eens naar kijken! Maar aangezien jouw nodo ontwerp niet met interrupts werkt en dus permanent in de loop () lus moet blijven zitten, is er volgens mij geen tijd om naar Pachube te versturen zonder misschien signalen te missen. Of zie ik dat verkeerd?

Ik wacht vol spanning op mijn NODO shield en ga dan zelf pas experimenteren hoe deze projecten in elkaar kunnen integreren :D
Sjoerdp
 
Berichten: 106
Geregistreerd: 01 okt 2011, 17:20

Re: Arduino hulp gezocht - crashende arduino

Berichtdoor Paul » 03 jan 2012, 21:52

Sjoerdp schreef:Maar aangezien jouw nodo ontwerp niet met interrupts werkt en dus permanent in de loop () lus moet blijven zitten, is er volgens mij geen tijd om naar Pachube te versturen zonder misschien signalen te missen. Of zie ik dat verkeerd?


Neen dat zie je niet verkeerd. In een vroegere versie werkte de Nodo wel op basis van interupts. Probleem was toen dat dat de seriele communicatie niet meer werkte. De interruptroutines vraten teveel tijd waardoor er in de seriele communicatie tekens niet meer konden worden gebufferd.

In de huidige V1.2.1 versie is het zo dat er geen gegevens wegvallen en er tijd genoeg is om signalen te verwerken. In de nieuwe release moet hier nog goed naar worden gekeken omdat de Aruino compiler v1.0 anders om gaat met communicatie en irq's.
Groeten Paul
Paul
 
Berichten: 1152
Geregistreerd: 31 aug 2011, 20:33

Re: Arduino hulp gezocht - crashende arduino

Berichtdoor Sjoerdp » 07 jan 2012, 13:23

Ik heb inmiddels de interrupts maar laten varen. Want zelfs met een in andere gevallen werkende watchdog, bleek hij toch nog te crashen. Geen idee waarom. Als iemand me dit kan uitleggen, erg graag! Want blijkbaar doe ik daar toch iets grondig fout (zie code hierboven).

Inmiddels heb ik alles stabiel werkend zonder interrupts door af en toe te pollen. Ook heb ik nu de Pachube library gebruikt om mij het leven makkelijker te maken. Ik heb de nieuwe sketch gepost in deze Thread: http://www.nodo-domotica.nl/forum/viewtopic.php?f=32&t=118
Sjoerdp
 
Berichten: 106
Geregistreerd: 01 okt 2011, 17:20

Re: Arduino hulp gezocht - crashende arduino

Berichtdoor Paul » 07 jan 2012, 14:23

Sjoerdp schreef:Ik heb inmiddels de interrupts maar laten varen. Want zelfs met een in andere gevallen werkende watchdog, bleek hij toch nog te crashen. Geen idee waarom. Als iemand me dit kan uitleggen, erg graag! Want blijkbaar doe ik daar toch iets grondig fout (zie code hierboven).

Inmiddels heb ik alles stabiel werkend zonder interrupts door af en toe te pollen. Ook heb ik nu de Pachube library gebruikt om mij het leven makkelijker te maken. Ik heb de nieuwe sketch gepost in deze Thread: http://www.nodo-domotica.nl/forum/viewtopic.php?f=32&t=118


Zal ik naar kijken!
Groeten Paul
Paul
 
Berichten: 1152
Geregistreerd: 31 aug 2011, 20:33


Keer terug naar Overige software Nodo

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers. en 1 gast

cron