Go Down

Topic: Newbie fehler ausmerzen (Read 366 times) previous topic - next topic

crazybanane

Hallo,

ich bin dabei mir ein neues kleines Projekt aufzubauen und habe den ein oder anderen Anfängerfehler drin.
Aktuelle Baustelle ist das später ein Relais unter der Vorraussetzung zweier Bedingungen Geschalter wird Vorraussetzung 1 ein Schwimmerschalter muss aktiviert werden <funzt, zweite vorraussetzung ist das die Batteriespannung stimmt< und genau das bekomme ich nicht hin trotzdessen er mir im Serial Monitor die richtigen werte ausgibt......Habe jetzt viele möglichkeiten ausprobiert mit hin und herschieben der Bedingung und größer-kleiner aber ich komme nicht zu dem ergebnis das das relais unter einer bestimmten spannung aus bleibt und erst bei der gesetzen spannung einschaltet. Vielleicht kann mir ja mal jemand weiterhelfen.
Danke


Peter-CAD-HST

#1
Aug 02, 2020, 05:00 am Last Edit: Aug 02, 2020, 05:45 am by Peter-CAD-HST
moin crazybanane

Tausch mal die Zeile in WasserstandPumpeBrunnen.ino

Code: [Select]
if (wasserstandAnfang == HIGH && (BatVoltage) >= 2.5 )

gegen

Code: [Select]
if ((wasserstandAnfang == HIGH) && (BatVoltage >2.5 ))

aus.

Ich habe die Änderung nicht getestet.


Viel Erfolg
Gruss Peter
und gesund bleiben

p.s. Hast du im IDE die Ausgabe von Compilermeldungen zur Kontrolle aktiviert?
p.p.s. Dein Sketch ist super kommentiert *daumen hoch*

KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

crazybanane

Hallo,

ich habe es ausprobiert aber es funktioniert leider nicht....
Ich versuche mal zu erklären was ich vorhabe:
Code: [Select]

//Die IF Abfrage im Tab WasserstandPumpeBrunnen soll sich den wert BatVoltage

//TAB:WasserstandPumpeBrunnen
void wasserstand()
{
  if ((wasserstandAnfang == HIGH && (BatVoltage) >= 2.5 )){
  digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
  }
}

//aus dem TAB: Batteriestand entnehmen



void getBattery()

{
  int x = analogRead(BatPin);                                            //Rohwert (0-1023) über Analogpin auf Basis von 5V (=1023)
  median1.add(x);                                                            //Wert für Mittelwert setzen
  long m = median1.getMedian();                                       //Mittelwert ermitteln

/*Nachdem der Median ausgerechnet ist, oder der Wert ermittelt wurde, werden die Daten weiterverarbeitet:*/

  unsigned long BatValue = m * 100L;                               //Wert um hundert multiplizieren, Vorbereitung zur Umrechnung in float/double
  float BatVoltage1 = BatValue * 5 / 1024L;                       //Ermittelter multiplizierter Rohwert in Spannung umrechnen (inkl. 2 Nachkommastellen als Ganzzahl)

/*Folgende 2 map()-Umwandlungen sind für unterschiedliche Weiterverarbeitung gedacht*/
  byte BatRate = map(BatVoltage1, 240, 420, 0, 100);       //Spannung in Prozent (2,40V=0%/4,20V=100%)
  byte BatRate1 = map(BatVoltage1, 350, 420, 0, 100);     //Spannung in Prozent (3,50V=0%/4,20V=100%)

  float BatVoltage = BatVoltage1 / 100.0;                          //Spannung in float 0.00 umwandeln

/*Ausgabe im Seriellen Monitor*/

  Serial.print("Batteriespannung ");
  Serial.print(BatVoltage);
  Serial.print("V");
  Serial.print("\t");
  Serial.print("Pumpe ");
  Serial.println(wasserstandAnfang);
}

// den Wert entnimmt er aber nur für das jeweilige TAB selbst aber nicht für andere das heisst aktuell
//nimmt der den Wert für WasserstandBrunnenPumpe nur aus der Globale und da steht halt leider 0.
// wenn ich die Globale lösche und ich will das er es aus dem BatterieStand Tab nimmt dann kommt immer

ERROR:
In function 'void wasserstand()':
WasserstandPumpeBrunnen:3:38: error: 'BatVoltage' was not declared in this scope
   if ((wasserstandAnfang == HIGH && (BatVoltage) >= 2.5 )){


Vielleicht konnte ich es so erklären das man mein Prob versteht und vielen dank im vorraus..






Peter-CAD-HST

Moin

die Variable 'BatVoltage' ist im ersten Sketch zu definieren.

Gruss Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

crazybanane

Die Antwort war mir leider etwas zu kurz für mein Verständniss...

Wie bekomme ich die Variable als ausgelesenen wert in den ersten Sketch??

Als Globale kann ich ja nur einen festen wert eintragen ich möchte aber sehr ungerne die einzelnen funktionen aus dem TAB doppelt in den Sketch einarbeiten wegen der übersicht?

Gibt es eine möglichkeit den ausgelesenen wert von TAB Batteriestand also VARIABLE BatVoltage in den ersten Sketch übertragen zu lassen so das meine IF Abfrage imTAB WasserstandBrunnenPumpe funktioniert?

Rentner

#5
Aug 02, 2020, 10:40 am Last Edit: Aug 02, 2020, 10:46 am by Rentner
Hallo,

wenn ich mich da einmischen darf.

Du hast die Variable float BatVoltage  in der Function getBatery deffiniert. Damit ist das eine lokale Variable innerhalb der Function und somit den übrigen Teilen icht bekannt. Darum die Fehlermelsung.

Schreibe die Zeile float BatVoltage; in den allgemeinteil des Sketches ganz am Anfang vor setup. Dann ist sie global.

Schaus dir das Thema Gültiigkeit von Variablen noch mal an .

Nachtag
enn Du das nicht willst kannst Du die Variablen einer Funktion auch übergeben. In deinem Fall bietet sich die Übergabe als Rückgabewert mittels retun an.

Heinz

uwefed

#6
Aug 02, 2020, 11:14 am Last Edit: Aug 02, 2020, 11:15 am by uwefed
Als Anfänger finde ich es nicht zielführend den Sketch in 5 Teilsketch-Tabs aufzuteilen. Das bringt nur Komplikationen und erschwert die Fehlersuche, vor allem für Anfänger.
Grüße Uwe

Doc_Arduino

Hallo,

habe das einmal komplett zusammengestrichen, wenns funktioniert und Ablauf verstanden, kannste deine Mittelwertbildung wieder einbauen.

Code: [Select]

const byte pinLed = 3; //aktuell noch nur led später pumpe für relais
const byte pinWasserSchalter = 13;
const byte pinBatterie = A7;


void setup()
{
  Serial.begin(9600);
  pinMode(pinLed, OUTPUT);
  pinMode(pinWasserSchalter, INPUT);
  pinMode(pinBatterie, INPUT_PULLUP);
}


void loop()
{
  if (trigger(2000) )   // aller 2s
  {
    bool pegel = getWasserstand(pinWasserSchalter);
    float voltage = getBattery(pinBatterie);
    anzeigeLed(pinLed, pegel, voltage);
    anzeigeSerial(pegel, voltage);
  }
}


float getBattery(const byte pin)
{
  unsigned int x = analogRead(pin);              // Rohwert (0-1023) über Analogpin auf Basis von 5V (=1023)
  float BatVoltage = 5.0 * x / 1024;
  return BatVoltage;
}


bool getWasserstand(const byte pin)
{
  bool schalter = digitalRead(pin);
  return schalter;
}


void anzeigeLed(const byte pin, const bool wasserstand, const float spannung)
{
  if (wasserstand && (spannung >= 2.5) )
  {
    digitalWrite(pin, HIGH);
  }
  else
  {
    digitalWrite(pin, LOW);
  }
}


void anzeigeSerial(const bool wasserstand, const float spannung)
{
  Serial.print("Batteriespannung ");
  Serial.print(spannung);
  Serial.print("V");
  Serial.print("\t");
  Serial.print("Pumpe ");
  Serial.println(wasserstand);
}


bool trigger (const unsigned long interval)
{
  bool trigger = false;
  static unsigned long lastMillis = 0;
  const unsigned long ms = millis();

  if (ms - lastMillis >= interval)
  {
    lastMillis = ms;
    trigger = true;
  }
  return trigger;
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Als Anfänger finde ich es nicht zielführend den Sketch in 5 Teilsketch-Tabs aufzuteilen
Vor allem nicht wenn jeder Teil nur eine Funktion enthält. Sowas macht man bei komplexeren Programmen

crazybanane

#9
Aug 02, 2020, 10:17 pm Last Edit: Aug 03, 2020, 06:55 am by crazybanane
Hallo,

habe das einmal komplett zusammengestrichen, wenns funktioniert und Ablauf verstanden, kannste deine Mittelwertbildung wieder einbauen.

Code: [Select]

const byte pinLed = 3; //aktuell noch nur led später pumpe für relais
const byte pinWasserSchalter = 13;
const byte pinBatterie = A7;


void setup()
{
  Serial.begin(9600);
  pinMode(pinLed, OUTPUT);
  pinMode(pinWasserSchalter, INPUT);
  pinMode(pinBatterie, INPUT_PULLUP);
}


void loop()
{
  if (trigger(2000) )   // aller 2s
  {
    bool pegel = getWasserstand(pinWasserSchalter);
    float voltage = getBattery(pinBatterie);
    anzeigeLed(pinLed, pegel, voltage);
    anzeigeSerial(pegel, voltage);
  }
}


float getBattery(const byte pin)
{
  unsigned int x = analogRead(pin);              // Rohwert (0-1023) über Analogpin auf Basis von 5V (=1023)
  float BatVoltage = 5.0 * x / 1024;
  return BatVoltage;
}


bool getWasserstand(const byte pin)
{
  bool schalter = digitalRead(pin);
  return schalter;
}


void anzeigeLed(const byte pin, const bool wasserstand, const float spannung)
{
  if (wasserstand && (spannung >= 2.5) )
  {
    digitalWrite(pin, HIGH);
  }
  else
  {
    digitalWrite(pin, LOW);
  }
}


void anzeigeSerial(const bool wasserstand, const float spannung)
{
  Serial.print("Batteriespannung ");
  Serial.print(spannung);
  Serial.print("V");
  Serial.print("\t");
  Serial.print("Pumpe ");
  Serial.println(wasserstand);
}


bool trigger (const unsigned long interval)
{
  bool trigger = false;
  static unsigned long lastMillis = 0;
  const unsigned long ms = millis();

  if (ms - lastMillis >= interval)
  {
    lastMillis = ms;
    trigger = true;
  }
  return trigger;
}


Ich habe mir den Code angeschaut und bin in mir in Arduino am beschreiben also //blabliblubb damit ich ihn für mich verständlich machen kann. jetzt ist mir allerdings eine sache aufgefallen sollte bei Spannung nicht voltage stehen weil es ja eigentlich in den globalen nicht deklariert ist oder hat man durch den aufruf nach
Code: [Select]

--------void anzeigeLed(const byte pin, const bool wasserstand, const float spannung)-------------

neue funktionsinterne variablen?
ich hätte jetzt von meinem aktuellen wissensstand gesagt das Spannung in dem falle durch voltage getauscht werden müsste oder bin ich jetzt falsch??


Code: [Select]

{
 if (wasserstand && ([s]spannung[/s][b]voltage[/b] >= 2.5) )
 {
   digitalWrite(pin, HIGH);
 }
 else
 {
   digitalWrite(pin, LOW);
 }
}

Danke und Danke auch für die Hilfestellungen

Tommy56

Das mit den Codetags konntest Du schon besser.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Rentner

Hallo,

ich wiederhole mich : schau Dir das Thema Funktionen und Gültigkeitsbereich von Variablen an . Lesen musst Du schon selber. http://www.c-howto.de/tutorial/

oder http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/009_c_funktionen_011.htm#mj19e69aaaa55d4a98fe6073fe2a99a2c6

Doc_Arduino

Hallo,

wenn ich du wäre würde ich es erstmal kompilieren, wenn es fehlerfrei kompiliert, kann schon einmal kein syntaktischer Fehler drin sein. Danach schauste dir an was lokale Variablen sind.

In der IDE alle Ausgaben einschalten.
Datei > Voreinstellungen >
- Ausführliche Ausgabe während > beide Haken rein
- Compilerwarnungen > "ALLE"
Zeilennummern und Codefaltung sind auch hilfreich.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up