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