Projekt: attiny85 Giessautomat

Hallo,

ich möchte mit einem attiny eine Pumpe steuern. Ein Taster für die vordefinierte Auswahl der Leistung (incl. eine Stufe um über Potentiometer Leistung zu regeln) der Pumpe und ein anderer Taster zum EIN/AUS schalten der Pumpe.
Die Pumpe habe ich über einen MOSFET angesteuert, die Taster sind hardware entprellt. Die Peripherie funktioniert auch soweit.
Da ich noch nie ein konkretes Projekt mit Microcontroller gemacht habe, nur einiges gelesen, kleine bsp. nachvollzogen usw, hapert es jetzt an der Software. Den Code lade ich mit einem USBtinyISP und der Arduino IDE auf den Controller.

Folgenden Code hab ich mir aus unterschiedlichen Quellen "zusammengeklaut" und angepasst, soweit ich der Meinung eben war dass es richtig sein müsste :wink:

// this constant won't change:
const byte m_button = 4;
const byte s_button = 1;
const int pinPot = 3;
const int ledPin = 2;            // the pin that the LED is attached to

// Variables will change:
byte m_buttonPushCounter = 0;    // (Menge) counter for the number of button presses
byte m_buttonState = 0;          // (Menge) current state of the button
byte m_lastButtonState = 0;      // (Menge) previous state of the button
byte s_buttonPushCounter = 0;    // (Start/Stop Taster) counter for the number of button presses
byte s_buttonState = 0;          // (Start/Stop Taster) current state of the button
byte s_lastButtonState = 0;      // (Start/Stop Taster) previous state of the button
byte ledState = LOW;             // ledState used to set the LED
//long previousMillis = 0;         // will store last time LED was updated
//long interval = 500;             // interval at which to blink (milliseconds)
int valPot = 0;                  // Zum zwischenspeichern des Potentiometerwert
byte pumpStart = 0;              //Sollwert der Pumpe (6-12V) von Potentiometer
byte pumpPoti;

void setup() 
{
  pinMode (4, INPUT);                                     // m_Button pin als Eingang deklariert
  pinMode (1, INPUT);                                     // s_Button pin als Eingang deklariert
  pinMode (0, OUTPUT);                                    // pin 5  // OC0A
  pinMode(ledPin, OUTPUT);

  // Timer 0, A side
  TCCR0A = _BV (WGM00) | _BV (WGM01) | _BV (COM0A1);      // fast PWM, clear OC0A on compare
  TCCR0B = _BV (CS00);                                    // fast PWM, top at 0xFF, no prescaler
  OCR0A = 0;                                              // PWM duty cycle (Timer 0, A side)
}  // end of setup

void loop() {

  // read the pushbutton input pin:
  m_buttonState = digitalRead(m_button);
  s_buttonState = digitalRead(s_button);

  valPot = analogRead(pinPot);                            //Potentiometerwert einlesen
  pumpPoti = map(valPot, 0, 1024, 135, 255);              //Anpassung Potentiometerwert (0-1024) zu pumpPoti (6-12V=135-255)

  if (m_buttonState != m_lastButtonState) {               // compare the buttonState to its previous state
    if (m_buttonState == HIGH) {                          // if the state has changed, increment the counter
      m_buttonPushCounter++;                              // if the current state is HIGH then the button went from off to on:
    }
  }             
  m_lastButtonState = m_buttonState;                      // save the current state as the last state, for next time through the loop
  if (m_buttonPushCounter == 1){
    pumpStart = 135;
  }
  if (m_buttonPushCounter == 2){
    pumpStart = 185;
  }
  if (m_buttonPushCounter % 3 == 0) {                     //Vergleich zwischen m_buttonPushCounter und Teiler, auf Rest 0
    digitalWrite(ledPin, HIGH);                            
    m_buttonPushCounter = 0;
    pumpStart = pumpPoti;
  } 
  else {
    digitalWrite(ledPin, LOW);
  }
  if (s_buttonState != s_lastButtonState) {               // compare the buttonState to its previous state
    if (s_buttonState == HIGH) {                          // if the state has changed, increment the counter
      s_buttonPushCounter++;                              // if the current state is HIGH then the button went from off to on:
    }
  }             
  s_lastButtonState = s_buttonState;                      // save the current state as the last state, for next time through the loop
  if (s_buttonPushCounter % 2 == 0) {                     //Vergleich zwischen m_buttonPushCounter und Teiler, auf Rest 0                           
    OCR0A = pumpStart;
    s_buttonPushCounter = 0;

  } 
  else {
    OCR0A = 0;                                            // PWM duty cycle (Timer 0, A side)
  }

}

Was schonmal echt gut geht ist der PWM-Ausgang, das Tastverhältnis lässt sich bequem über das Register (heißt das so?) OCR0A verändern, zumindest kann ich über den Wert 135-255 die Pumpe in ihren Betriebsparametern betreiben. Was ich noch rausgefunden habe ist das die Frequenz bei 31,5 kHz liegt, ob das gut oder schlecht ist weiß ich allerdings nicht (Timer 0 Frequenz im Chip?). Der Pumpe ist es egal weil es nur ein Gleichstrommotor mit 6-12V ist.
Was mir nicht so gefällt ist, wie ich das mit den Tastern gemacht habe, das sieht für mich im Grundsatz irgendwie sehr umständlich aus.
Ich kann mit dem "s_button" die Pumpe starten und danach die einzelen Stufen mit dem "m_button" auswählen. Auch die Stufe wo der Potiwert benutzt wird funktioniert. Wenn die Pumpe nicht läuft, kann ich allerdings nicht mehr die einzelnen Stufen auswählen, quasi eine Vorauswahl treffen bevor die Pumpe läuft. Der attiny macht was er will und ich habe nicht verstanden warum.
Ich hoffe jemand erbarmt sich und kann mir erklären was ich falsch mache, ich komme im Moment so nicht weiter.
Mein Verfahren ist bis jetzt eher "try and error" :wink:

Und da ich zwar ein ganz klein bisschen Ahnung von Elektronik habe, mir aber trotzdem, nicht so ganz sicher bin bei der Ansteuerung des MOSFET, poste ich noch nen Schaltplan so wie ich es bis jetzt aufgesteckt habe. Kann mir wer sagen wazu ich laut Datenblat D3 benötige wenn ich doch D2 habe? Hab sie verbaut schadet ja nicht...

Wenn ich das grundlegendste endlich mal verstanden habe soll der Automat natürlich noch umfangreicher in der funktion werden. Definierte Abgabemenge usw.
Ich bin für jeden Tippp dankbar,

Weihnachtliche Grüße

Wieso baust Du einen Spannungsteiler in den Tastenstromkreis? Ohne 10kOhm Widerstände funktioniert es sicherer.
Grüße Uwe

Da ich ja Taster verwende dachte ich beim entladen (also taster betätigt) das prellen so zu reduzieren, quasi lade und entlade Kurve im Kondensator zu puffern.
In der Praxis Funktionieren dieTaster tadellos (überprüft), aber wenn die 10k wirklich keinen sinn machen kann ich sie natürlich weg lassen.

Edit: hab mal gerechnet das low liegt bei betätigtem Taster auf ca 1.56V.