Pages: [1] 2   Go Down
Author Topic: Plötzlich komisches verhalten Uno/Mega fehlerhafte Impulse  (Read 2093 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

mir ist gestern etwas komisches aufgefallen.

Ich habe einen Uno + LCD an einen So-Bus Zähler angeschlossen.
Das Coding ist ganz schlicht. Es wird jeder Impuls(1000 Imp je kWh) gelesen und auf dem Display ausgegeben.

Das hat mehrere Tage super funktioniert, gestern wollte ich das Coding auf Interrupt umstellen. Leider ohne erfolg.
Also habe ich das alte Coding wieder hochgeladen.

Der So-Bus hängt an Digital 2. Ich bin dann durch Zufall gegen den Pin gekommen und musste feststellen er fängt an zu zählen.

Habe dann meinen Mega genommen und musste das gleiche verhalten feststellen.

In Kurzform:
Wenn ich den Pin 2 berühre, werden extrem viele Impulse gelesen.
Auch wenn ich den Arduino wieder an den So-Bus anschließe, zählt er plötzlich falsch.

Schaltung ist sehr überschaubar. GRD + Pin2

Hat jemand eine Idee was es sein kann?
Das Coding hatte ich im Internet gefunden und es hat auch wunderbar funktioniert.
Wenn Pin2 == High Zähler hochzählen.


Hat jemand einen Tipp für mich?


Dank und Grüße,
nox


Hier noch das Coding
**********************
Code:
#include <EEPROM.h>
#include <Arduino.h>  // for type definitions
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);    // Pinbelegung für SainSmart LCD Keypad Shield

const int IMPULSE = 1000;     // hier die Impulse pro kWh vom Stromzähler eintragen
const int long RECHENIMP = 3600000 / IMPULSE * 1000;
const int sobus = 2;
int long ElapsedTime = 0;
int long StartTime = 0;
int long WATT = 0;
int long COUNT = 0;
float KWH;

int impState = 0;
int lastimpState = 0;

void setup() {
  
  pinMode(sobus, INPUT);            
  digitalWrite(sobus, LOW);  

  lcd.begin(16, 2);
  lcd.print("Boot...");
  delay(500);
}

void loop() {

  impState = digitalRead(sobus);      // Pin 2 auslesen

  if (impState != lastimpState) {
    if (impState == HIGH) {

      ElapsedTime = millis() - StartTime;
      StartTime = millis();
      WATT = RECHENIMP / ElapsedTime;

      COUNT++;

      KWH = (float)COUNT / IMPULSE;

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Aktuell:");
      lcd.setCursor(9, 0);
      lcd.print(WATT);

      lcd.setCursor(0, 1);
      lcd.print("kW/h:");
      lcd.setCursor(9, 1);
      lcd.print(KWH);

      delay(20);
    }
  }

  lastimpState = impState;  
}
« Last Edit: March 07, 2014, 03:40:05 pm by uwefed » Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
pinMode(sobus, INPUT);             
digitalWrite(sobus, LOW);   

Was willst du denn damit erreichen? Ein digitaler Eingang mnuss immer ein definiertes Pegel haben, sonst fängt man sich massiv Störungen ein, der Pin wirkt wie eine Antenne. So wie es aussieht, brauchst du nur einen externen Pull-Down-Widerstand, wenn du auf impstate auf HIGH-Pegel prüfst.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

ursprünglich war es anders.


pinMode(sobus, INPUT);             
digitalWrite(sobus, HIGH);    <- Pullup

Leider hat es so nicht bei mir funktioniert.


Bin aktuell noch sehr neu in dem Thema.

<brauchst du nur einen externen Pull-Down-Widerstand, wenn du auf impstate auf HIGH-Pegel prüfst.


Wärst du so nett und würdest es etwas ausführen? Und ist es erklärbar, warum es eine kurze Zeit funktioniert hat?

Dank und Grüße,
nox
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ursprünglich war es anders.

pinMode(sobus, INPUT);            
digitalWrite(sobus, HIGH);    <- Pullup

Leider hat es so nicht bei mir funktioniert.

Input Signale offen lassen geht nicht. Mindestens wenn ein Stück Draht dranhängt, das auf der anderen Seite nicht verbunden ist, fängst du dir irgendein Signal, beliebig schnell wechselnd, ein.
Schau dir das Button-Beispiel an. Das benutzt einen PullDown Widerstand.

digitalWrite(sobus, HIGH);   //  Pullup ...sorgt dafür, dass ein offenes Eingangssignal sicher HIGH ist. Um ein LOW Signal zu erhalten, verbindest du es direkt mit GND ( z.B. über einen Taster ), ohne einen externen Widerstand zu brauchen.
« Last Edit: November 06, 2012, 05:46:13 am by michael_x » Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Kleine Anmerkung:
Code:
pinMode(sobus, INPUT);             
digitalWrite(sobus, HIGH);
Dieser Code aktiviert den internen Pull-Up-Widerstand. Da diese beiden Zeilen aber (gerade für Anfänger) sehr verwirrend sind, kann man in den neueren Versionen der Arduino-IDE auch einfach: pinMode(sobus, INPUT_PULLUP); schreiben.
Einen internen Pull-Down-Widerstand gibt es übrigens nicht, wenn benötigt muss eben ein externer Widerstand vorgesehen werden.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

danke für die Tipps!

Aber eins verstehe ich einfach nicht. Warum ging es 2-3 Tage? Zufall?

Und noch eine viel wichtigere Frage, wie lernt man sowas? Einfach durch Erfahrung?
Elektro Studium?

Für Anfänger:
Wie unter dem Link "Button" angegeben, sollte ich eine Wiederstand auf GND legen?

Bin wie gesagt noch am lernen. Deswegen die für manche bestimmt "blöden" Fragen.


Dank und Grüße,
nox
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Aber eins verstehe ich einfach nicht. Warum ging es 2-3 Tage? Zufall?
Ja, Zufall und/oder günstige Bedingungen.

Quote
Und noch eine viel wichtigere Frage, wie lernt man sowas? Einfach durch Erfahrung?
Elektro Studium?
Ich glaube, die wenigsten haben hier ein Elektronik-Studium hinter sich. Es fällt aber auch nicht unter den Bereich Allgemeinwissen. Wenn man sich erst einmal damit auseinandergesetzt hat, denkt man von ganz allein an solche Sachen.

Quote
Für Anfänger:
Wie unter dem Link "Button" angegeben, sollte ich eine Wiederstand auf GND legen?
Richtig erkannt, steht auch als Kommentar im Quellcode: * 10K resistor attached to pin 2 from ground

Quote
Bin wie gesagt noch am lernen. Deswegen die für manche bestimmt "blöden" Fragen.
Dafür gibt es ja das Forum, dass man Fragen stellen kann. Und irgendwann kann man was vom Gelernten wieder zurückgeben.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Und noch eine viel wichtigere Frage, wie lernt man sowas? Einfach durch Erfahrung?
Elektro Studium?
Bin wie gesagt noch am lernen. Deswegen die für manche bestimmt "blöden" Fragen.
Es gibt keine blöden Fragen, nur blöde Antworten. Einige dieser "blöden" Fragen sind die fiesesten zu beantworten.  smiley-wink smiley-wink smiley-wink
Das lernst Du aus Erfahrung, weil Du diese Fehler machst. Dann beim nächsten mal erinnerst Du Dich sicher und machst      andere Fehler smiley-wink smiley-wink smiley-wink
Grüße Uwe

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

vielen Dank für eure Hilfe.
Stand jetzt scheint es zu funktionieren.

Leider bin ich dann direkt zu mutig geworden und wollte es mit einem Interrupt + DS18B20 versuchen.

Das funktioniert aber nicht so wirklich. Vermutlich benutze ich den Interrupt falsch.
Werde noch berichten ob ich Erfolg hatte.

Eine Frage habe ich noch. Ich scheine mit der Stromversorgung leichte Probleme zu haben. Ich wollte den Uno+LCD für den So-Bus Zähler über ein Iphone Lagegerät laufen lassen. Aber wenn ich das angeschlossen habe, wird auf dem LCD totaler quatsch angezeigt. Über das Notebook sieht es ok aus. Mag es an der fehlenden Leistung des Netzteils liegen?


Grüße,
nox
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn Du die Hintergrundbeleuchtung des Displays an hast: wahrscheinlich. Klemm diese mal ab.
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

danke ich benutze ich ein andere Netzteil.

Auf den ersten Blick funktioniert jetzt alles. Leider aber nur auf den ersten.
Wenn der Arduino länger läuft, gehen die Zählerstände auseinander.
Zum Test habe ich schon einen einfachen Counter eingebaut, um mir die Takte ansehen zu können.

Das verhalten habe ich , wenn ich es mit Interrupt versuche und mit den alten Coding.

Hat noch jemand eine Idee? Bin mir langsam nicht mehr sicher, ob der Zähler auch wirklich 1000 imp/kWh ausgibt.

Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);    // Pinbelegung für SainSmart LCD Keypad Shield


const int IMPULSE = 1000;     // hier die Impulse pro kWh vom Stromzähler eintragen

const int long RECHENIMP = 3600000 / IMPULSE * 1000;

int long ElapsedTime = 0;
int long StartTime = 0;
int long WATT = 0;
int long COUNT = 0;
int counter;
float KWH;

int impState = 0;
int lastimpState = 0;


void setup() {
  lcd.begin(16, 4);
  lcd.print("Boot...");
  delay(200);
  lcd.clear();
  lcd.setCursor(0, 0);   
  lcd.print("BASTELGARAGE.de");
  delay(100);
  lcd.setCursor(0, 1);   
  lcd.print("EnergieMonitor");
  delay(400);

  pinMode(2, INPUT);             // Pin 2 als Eingang
  digitalWrite(2, HIGH);         // Interner Pullup Widerstand AN

}



void loop() {

  impState = digitalRead(2);      // Pin 2 auslesen

  if (impState != lastimpState) {
    if (impState == LOW) {

      counter++;

      ElapsedTime = millis() - StartTime;
      StartTime = millis();
      WATT = RECHENIMP / ElapsedTime;

      COUNT++;

      KWH = (float)COUNT / IMPULSE;

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Aktuell:");
      lcd.setCursor(9, 0);
      lcd.print(WATT);

      lcd.setCursor(0, 1);
      lcd.print("kW/h:");
      lcd.setCursor(9, 1);
      lcd.print(KWH);
      lcd.setCursor(1, 2);
      lcd.print(counter);
      delay(20);
    }
  }
  lastimpState = impState; 
}

Grüße,
nox
« Last Edit: November 11, 2012, 01:39:37 pm by uwefed » Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Du schreibst auf dein LCD "Bastelgarage.de", die Seite habe ich mir mal angesehen. Da ist auch eine Abbildung deines Stromzählers mit einem kleinen Hinweis "1600 imp/kwh". Sollte das schon die Lösung sein? Oder hast du einen anderen Zähler zu überwachen?
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

ja das kommt von da. Dachte es ist fair es erst mal drin zu lassen.

Die Impulse habe ich angepasst.

      const int IMPULSE = 1000;     // hier die Impulse pro kWh vom Stromzähler eintragen

Zum Test habe ich auch einen Counter eingebaut. Der Zählt einfach pro Impuls +1.

      counter++;

Aber selbst der counter passt irgendwann nicht mehr.


Grüße,
nox
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit welchem Sensor wertest du denn die Impulse aus?
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

B+G
DRT428B - 3x 230/400V 20(80)A

Weiß langsam nicht mehr, wie ich den Fehler eingrenzen soll.
Logged

Pages: [1] 2   Go Up
Jump to: