ESP8266 loopt vast

Software vragen voor ESP chip familie
Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 08 Feb 2017, 11:09

waarom werkt dit bijvoorbeeld niet?
Code: Alles selecteren
for(int i = 0; i <6; i++)
{
  Serial.println(tijdIndeling[i]);
}


ik krijg dan de volgende foutmelding
Code: Alles selecteren
Arduino: 1.8.1 (Windows XP), Board:"Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None"

C:\Arduino\arduino-1.8.1\Portable\sketchbook\zonnepaneelversie_3\zonnepaneelversie_3.ino: In function 'void loop()':

zonnepaneelversie_3:130: error: no match for 'operator[]' (operand types are 'loop()::<anonymous union>' and 'int')

   Serial.println(tijdIndeling[i]);

                              ^

exit status 1
no match for 'operator[]' (operand types are 'loop()::<anonymous union>' and 'int')

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Advertisement

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

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 08 Feb 2017, 12:00

René schreef:waarom werkt dit bijvoorbeeld niet?
Code: Alles selecteren
for(int i = 0; i <6; i++)
{
  Serial.println(tijdIndeling[i]);
}


ik krijg dan de volgende foutmelding
Code: Alles selecteren
Arduino: 1.8.1 (Windows XP), Board:"Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None"

C:\Arduino\arduino-1.8.1\Portable\sketchbook\zonnepaneelversie_3\zonnepaneelversie_3.ino: In function 'void loop()':

zonnepaneelversie_3:130: error: no match for 'operator[]' (operand types are 'loop()::<anonymous union>' and 'int')

   Serial.println(tijdIndeling[i]);

                              ^

exit status 1
no match for 'operator[]' (operand types are 'loop()::<anonymous union>' and 'int')

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


Omdat tijdindeling geen char array is. De union is als volgt:
cpp code
union {
struct {
char urenAlsChar[2];
char dubbelePunt;
char minutenAlsChar[2];
char terminator;
};
char tijdAlsCharArray[6];
} tijdIndeling;

Binnen tijdIndeling heb je een arrach van 6 chars (tijdAlsCharArray) en een struct die je eroverheen legt.
Als je een van die 2 (struct of char array) wilt benaderen, dan geef dat op als tijdIndeling.tijdAlsCharArray. Of tijdindeling.urenAlsChar etc.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 08 Feb 2017, 12:31

Dat kwartje begon bij net te vallen.

wat grappig allemaal. tnx

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

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 08 Feb 2017, 13:31

Ik heb je code maar gelijk ff string vrij gemaakt. Dan krijg je dit:
cpp code
#include <Arduino.h>
/*
* programma meet de SO pulsen van een kwh meter die de levering van zonnepanelen meet
* programma stuurt data via HTTP GET requests naar PVoutput.org service.
* programma draait op een esp8266 v1.5.0
* via een website (google.com) wordt de tijd opgehaald
*/
#include <ESP8266WiFi.h>

//Number of pulses, used to measure energy.
long pulseCount = 0;
//Used to measure power.
unsigned long pulseTime, lastTime;

boolean pulse = false;

//power and energy
//double power, opbrengst;
double power, opbrengst;
//Number of pulses per wh - found or set on the meter.
int ppwh = 1; //1000 pulses/kwh = 1 pulse per wh

const char monthArray[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov","Dec"};

const char* ssid = "XXXXXXXX";
const char* password = "XXXXXXXX";
const char* host = "pvoutput.org";
const char* SystemId = "XXXXXXXX";
const char* APIKey = "XXXXXXXXXXXXXXXXXXXX";
int datum = 20170117;
unsigned long sendTime = 5000; // tijd tussen verzenden data TIJDELIJK
//unsigned long sendTime =300000; // tijd tussen verzenden data
unsigned long sent = 0; // tijd tussen verzenden data
unsigned long nopowerTime = 1200000; // tijdsduur geen pulsen meer ontvangen
uint8_t dag = 1;
uint8_t maand = 1;
uint16_t jaar = 2017;
uint8_t uur = 1;
uint8_t minuut = 1;

void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// KWH pulsen worden geteld via interrupt
attachInterrupt(2, onPulse, FALLING);
}

void loop() {

char tijdstring[30]; // ontvangst veld van getTime2.

if (pulse) {
pulse = !pulse;
pulseCount++;
lastTime = pulseTime;
pulseTime = millis();
//Calculate power
power = (3600000.0 / (pulseTime - lastTime)) / ppwh;
//Find Wh elapsed
opbrengst = (1.0 * pulseCount / (ppwh));
}

if ((nopowerTime + pulseTime) > millis()) {
if ((sent + sendTime) < millis()) {

//*******************
//
// leg de indeling van de uren en minuten over een 6 byte veld (5 voor de tijd + 1 byte voor de terminator ('\0')
union {
struct {
char urenAlsChar[2];
char dubbelePunt;
char minutenAlsChar[2];
char terminator;
};
char tijdAlsCharArray[6];
} tijdIndeling;

//
// eerst het resultaat veilig stellen. Dit omdat de char array in de functie dynamisch is en zo kan verdwijnen
//
strcpy(tijdstring, getTime()); // getTime2 geeft een pointer terug dus we kunnen die gelijk in de copy slag gebruiken

//
// nu nog ff de uren/minuten zoeken
//
char * pos = strstr(tijdstring, ":"); // we krijgen een char pointer terug waar de eerste : voorkwam in de array

if (pos != NULL) { // en die moet gevuld zijn
//
// nu 2 posities teruggaan en we hebben het begin van de uren
// deze kopieren we in de union tijdIndeling samen met de dubbele punt en minuten
//
pos = pos - 2;
strncpy(tijdIndeling.tijdAlsCharArray, pos, 5);
//
// maak nu van uren en minuten elk een kleine char array
//
tijdIndeling.dubbelePunt = '\0';
tijdIndeling.terminator = '\0';
//
// beide kun je nu converteren in een uint8_t bijv.
//
uur = atoi(tijdIndeling.urenAlsChar);
minuut = atoi(tijdIndeling.minutenAlsChar);
} else {
//
// als je hier terecht zou komen dan heb je geen tijdstring ontvangen
//
Serial.println("Geen tijd kunnen vinden");
}

//*********************
char werkveld[5]; // ff een werkveld om te converteren

strncpy(werkveld, &tijdstring[6], 2); // converteer dag
werkveld[2] = '\0';
dag = atoi(werkveld);

strncpy(werkveld, &tijdstring[8], 3); // converteerd maand
werkveld[3] = '\0';
maand = findMonthIndex(werkveld);

strncpy(werkveld, &tijdstring[12], 4); // converteer jaar
werkveld[4] = '\0';
jaar = atoi(werkveld);
//
// GMT aanpassing
//
uur++;
if (uur == 24) {
uur = 0;
}

//
// //Serial.print("connecting to ");
// //Serial.println(host);
// // Use WiFiClient class to create TCP connections
// WiFiClient client;
// const int httpPort = 80;
// if (!client.connect(host, httpPort)) {
// Serial.println("connection failed");
// return;
// }
// // We now create a URI for the request
char url [200]; // char array om url op te bouwen
char opbrengstStr[10]; // om een float in char array om te zetten
char powerStr[10]; // om een float in char array om te zetten

dtostrf(opbrengst, 7, 2, opbrengstStr); // zet de float om in een 7.2 cijfer
strcpy(opbrengstStr, trimLeadingSpaces(opbrengstStr)); // en haal de voorloop spaties weg

dtostrf(power, 7, 2, powerStr);
strcpy(powerStr, trimLeadingSpaces(powerStr));
//
// bouw de url op
//
sprintf(url, "/service/r2/addstatus.jsp?key=%s&sid=%s&d=%4d%02d%02d&t=%02d:%02d&v1=%s&v2=%s",
APIKey,
SystemId,
jaar,
maand,
dag,
uur,
minuut,
opbrengstStr,
powerStr);
Serial.println(url);

// This will send the request to the server
/* client.print(String("GET ") + url + " HTTP/1.1\r\n" + //TIJDELIJK UITGEZET
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
//Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
// Read all the lines of the reply from server and print them to Serial
while(client.available()) {
String line = client.readStringUntil('\r');
//Serial.print(line);
}
*///Serial.println();
//Serial.println("closing connection");
sent = millis();
if ((pulseTime + 600000) < millis()) {
power = 0.0; // als er 10 minuten geen pulsen zijn gekomen is power 0
}
}
} else {
//Serial.println("verzenden mag niet meer");
if (uur == 22) {
pulseCount = 0;
opbrengst = 0.0;
power = 0.0;
}
}
} // einde loop

char * getTime() // functie om tijd op te halen van website
{
char charArray[200]; // ff ruim genomen
charArray[0] = '\0'; // de regel leegmaken
uint8_t charArrayIndex = 0; // index binnen array
WiFiClient client;
while (!!!client.connect("www.google.com", 80)) {
Serial.println("connection failed, retrying...");
}
client.print("HEAD / HTTP/1.1\r\n\r\n"); // dit zorgt ervoor dat de server de tijd teruggeeft
while (!!!client.available()) {
yield();
}

while (client.available()) {
charArray[charArrayIndex] = client.read(); // lees teken in de tabel
if (charArray[charArrayIndex] == '\r') { // blijven lezen tot er een return komt
charArray[charArrayIndex] = '\0'; // en sluit te tekst af met een '\0'. De return halen we gelijk weg
//
// kijk of dit de datumregel is
//
char *startPositie;
startPositie = strstr(charArray, "\nDate: ");
//
// is dit is onze regel?
//
if (startPositie != NULL) {
//
// yep dus skip 7 posities en we hebben het startpunt
//
startPositie = startPositie + 7; //was 7
client.stop();
return startPositie;
} else {
// Serial.println(" niet de gewenste regel dus zet hem maar weer op 0 in else");
//
charArray[0] = '\0';
charArrayIndex = 0;
}
} else {
charArrayIndex++;
}
}
Serial.println("als je hier terecht komt heb je niet hetgene ontvangen wat je wilde");
client.stop();
return (char *) NULL;
}

void onPulse() { // The interrupt routine
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 1500) { //declare the debounce/block out interval in setup
pulse = true;
}
last_interrupt_time = interrupt_time;
}
/**
* @name findMonthIndex
* @param monthChar char array to month name in 3 chars + \0
* @return uint8_t month index
*/
uint8_t findMonthIndex(char * monthChar){
uint8_t month;
//
// zoek door de maanden tabel
//
for (month = 0; month < 12; month++) {
if (strcmp(monthChar, &monthArray[month][0]) == 0) {
//
// gevonden. Dus verder zoeken niet nodig
//
break;
}
}

month++; // 1 erbij optellen omdat we beginnen bij 0
return month;
}
/**
* @name trimLeadingSpaces
* @param charString pointer to string containing chars
* @return new pointer to first non space
*/
char * trimLeadingSpaces(char * charString) {

char *ptr = charString;

for (uint16_t i = 0; i < strlen(charString); i++) {
//
// kijk of het een spatie is
if (*ptr == 0x20 ) {
ptr++;
} else {
//
// we zijn er dus klaar
//
break;
}
}
return ptr;
}


Dit komt er nu uit via de serial

cpp code
/service/r2/addstatus.jsp?key=XXXXXXXXXXXXXXXXXXXX&sid=XXXXXXXX&d=20170208&t=12:33&v1=0.00&v2=0.00
/service/r2/addstatus.jsp?key=XXXXXXXXXXXXXXXXXXXX&sid=XXXXXXXX&d=20170208&t=12:33&v1=0.00&v2=0.00
/service/r2/addstatus.jsp?key=XXXXXXXXXXXXXXXXXXXX&sid=XXXXXXXX&d=20170208&t=12:33&v1=0.00&v2=0.00
/service/r2/addstatus.jsp?key=XXXXXXXXXXXXXXXXXXXX&sid=XXXXXXXX&d=20170208&t=12:33&v1=0.00&v2=0.00
/service/r2/addstatus.jsp?key=XXXXXXXXXXXXXXXXXXXX&sid=XXXXXXXX&d=20170208&t=12:34&v1=0.00&v2=0.00
/service/r2/addstatus.jsp?key=XXXXXXXXXXXXXXXXXXXX&sid=XXXXXXXX&d=20170208&t=12:34&v1=0.00&v2=0.00
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 08 Feb 2017, 14:14

Briljant!! Wow Nico bedankt. Ik was zelf de "datum" aan het ombouwen naar analogie van de tijd en schoot al best een beetje op:))
Ik zie in jouw code dat het veel slimmer kan. Ook de GMT aanpassen en de maand van tekst door de index van die char te gebruiken. Als ik het zo zie lijkt het logisch maar het was voor mij nog wel "ver weg"
Errruuuggg leerzaam. Dank je hartelijk. Ik ga het nog eens effe goed bestuderen en dan ga ik het duurproeven( aanzetten en afblijven en kijken of het stabiel is) Natuurlijk laat ik het resultaat weten.
Helemaal te gek Nico.

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

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 08 Feb 2017, 14:46

Ach het is een goede exercitie in het gebruik van pointers.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 08 Feb 2017, 14:57

here it comes

http://pvoutput.org/intraday.jsp?id=548 ... 7&gs=0&m=1


elke 5 minuten stroomt het geld binnen:)

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

Re: ESP8266 loopt vast

Berichtdoor Koepel » 08 Feb 2017, 18:00

Hoeveel panelen heb je op het dak liggen ? Een stuk of 6 ?
Het valt me op dat de "map" laat zien dat er alleen tussen Eindhoven en Nijmegen van PVOutput gebruik wordt gemaakt.
Is er met die getallen al iets te zeggen over de jaaropbrengst ?
Ik heb ook zonnepanelen op het dak liggen, maar ze zijn nog niet aangesloten. Dus als de zon schijnt dan is dat voor niets (huh :shock: ).

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 08 Feb 2017, 18:28

dag Koepel,

Ik heb 8 panelen op het dak liggen. die kunnen maximaal 2000 Wpiek leveren. Hoeveel het opbrengt per jaar weet ik nog niet maar als ik mijn dagelijkse productie vergelijk met anderen dan gaat dat vast wel goed komen er zijn op internet wel invulschermpjes om je verwachte opbrengst te berekenen. Ik kom dan uit op ca 1500 tot 1700 kWh per jaar. Dat is ongeveer mijn halve gebruik per jaar.
René

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

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 08 Feb 2017, 18:43

Mijn buren hebben 11 panelen op het dak van volgens hun besturing (die wijd open staat) haalden ze in ruim een jaar iets van 3700kwh uit. Volgens dat apparaat.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

VorigeVolgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten