Newbie fehler ausmerzen

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

Gartensteuerung.zip (2 KB)

(deleted)

Hallo,

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

//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..

(deleted)

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?

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

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

Hallo,

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

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;
}

uwefed:
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

Doc_Arduino:
Hallo,

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

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

--------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??

{
 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

Das mit den Codetags konntest Du schon besser.

Gruß Tommy

Hallo,

ich wiederhole mich : schau Dir das Thema Funktionen und Gültigkeitsbereich von Variablen an . Lesen musst Du schon selber. Tutorial Start | C-HowTo

oder Rheinwerk Computing :: C von A bis Z – 9.11 Geltungsbereich von Variablen

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.