Laderelais über Taster schalten

ullimon

New member
Hallo zusammen,

ich würde gerne mein Automatikladegerät verwenden und hierzu einen Taster in meinen Ardumower einbauen, wo dann das Relais schaltet.
Wo baue ich die Abfrage Buttons ein?

Das habe ich gefunden:

case 'a':
setNextState(STATE_STATION_CHARGING, 0); // press 't' to simulate in station charging
break;

Grüße

Simon
 
Beispiel: Taster ist an Pin 9 angeschlossen, Relais ist an Pin 8 angeschlossen

In "mower.h" definierst Du die zwei neuen Pins:

Code:
#define pinMyRelay 8
#define pinMyButton 9


In der "Mower::setup()"-Funktion kannst Du die neuen Pins konfigurieren (mower.cpp):

Code:
void Mower::setup(){
  pinMode(pinMyRelay, OUTPUT); // Pin als Ausgang konfigurieren
  pinMode(pinMyButton, INPUT_PULLUP);  // Pin als Eingang konfigurieren und mit Pull Up Widerstand
   ...


Die Abfrage des Tasters (externen Buttons) kannst Du dann ganz oben in die "Robot::loop()"-Funktion in robot.cpp einbauen.

Code:
void Robot::loop(){
  if (digitalRead(pinButton) == LOW){
     // Taster ist gedrückt (GND)
    digitalWrite(pinMyRelay, HIGH); // Relais schalten
  } else {
    // Taster ist nicht gedrückt (HIGH)
    digitalWrite(pinMyRelay, LOW); // Relais fallen lassen
  }
   ...
 
Soweit habe ich es verstanden. Ich möchte das Laderais der Platine schalten. Also den Vorgang im Code simulieren das Ladestrom anliegt. Leider liegt dieser bei einem Automatikladegerät ja erst an wenn Spannung gemessen wird.
Also müsste ich den Taster so in den Code einbauen das es passt, hier komme ich im Moment nicht weiter.
Grüße
 
Das ganze Programm ist ein Zustandsautomat (siehe auch Bild unter http://wiki.ardumower.de/index.php?title=Ardumower_software_design), d.h. es gibt Zustände worin der Roboter sich befinden kann und was er dort macht und Ereignisse welchen den Zustand ändern. Du möchtest also in den Zustand "STATION" gehen und das geht so:


Code:
setNextState(STATE_STATION, 0);


Genauso macht es das Perimeter-Tracking auch: wenn im Zustand "STATE_PERI_TRACK" Spannung an den Kontakten anliegt soll er in den Zustand "STATION" gehen:

Code:
case STATE_PERI_TRACK:
      // track perimeter
      checkCurrent();                  
      checkBumpersPerimeter();
      //checkSonar();                   
      if (batMonitor){
        if (chgVoltage > 5.0){ 
          setNextState(STATE_STATION, 0);
        }
      }
      break;
 
Ich habe jetzt folgendes in den Code eingebaut:
robot.cpp:

Code:
if (digitalRead(pinMyButton) == LOW) {
    // Taster ist gedrückt (GND)
    Console.println(F("STATION gefunden"));
    setNextState(STATE_STATION, 0);
  }

.....

if (stateNew == STATE_STATION) {
    setMotorPWM(0, 0, false);
    setDefaults();
    statsMowTimeTotalStart = false;  // stop stats mowTime counter
    loadSaveRobotStats(false);        //save robot stats
     Console.println(F("Robo in Station"));
    setNextState(STATE_STATION_CHARGING, 0);

  }
  if (stateNew == STATE_STATION_CHARGING) {
    Console.println(F("Robo ladet"));
    setActuator(ACT_CHGRELAY, 1);
    setDefaults();
  }


Wenn ich jetzt den Taster betätige sehe ich die Seriellen Ausgaben, nur das Relais zieht nicht an. Sollte es aber, oder?

Danke
 
Oben