Go Down

Topic: Startknopf (Read 2 times) previous topic - next topic

strohhirn

Sep 14, 2012, 02:22 pm Last Edit: Sep 14, 2012, 02:26 pm by strohhirn Reason: 1
Guten Tag,
Ich arbeite gerade an einem Programm das beim anschließen des arduino nicht gleich starten soll.
Dafür habe ich mir gedacht baue ich einen Startknopf ein.
Wenn ich ihn kurz drücke soll das programm1 starten und wenn ich nochmal drauf drücke soll es anhalten.
Das programm soll unter anderem am anfang ein relais einschalten und bei 27°C ausschalten.
Doch irgenwie klappt es nicht. Hier einmal mein sketch :
Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor1 = {0x28, 0xCD, 0x9B, 0xDA, 0x03, 0x00, 0x00, 0xF2};
DeviceAddress Sensor2 = {0x28, 0x1F, 0xA3, 0xDA, 0x03, 0x00, 0x00, 0xE2};
DeviceAddress Sensor3 = {0x28, 0x2D, 0xB9, 0xDA, 0x03, 0x00, 0x00, 0xA0};
DeviceAddress Sensor4 = {0x28, 0x37, 0x88, 0xDA, 0x03, 0x00, 0x00, 0x7D};

int backLight = 29;
int k1 = 31;   //relais
int k2 = 32;   //relais
int k3 = 33; //relais

int knopf1 = 34;
int buttonState = 0; //knopf
int buttonPushCounter = 0;
int lastButtonState = 0;


void setup() {
 pinMode(backLight, OUTPUT);
 digitalWrite(backLight, HIGH);
 lcd.begin(20, 4);
 sensors.begin();
 pinMode(k1, OUTPUT);
 pinMode(k2, OUTPUT);
 pinMode(k3, OUTPUT);
 pinMode(knopf1, INPUT);
}

void loop(){
   sensors.requestTemperatures();
 if (sensors.isConnected(Sensor1)){
 lcd.setCursor(0, 0);
 lcd.print("T1:");
 lcd.print(sensors.getTempC(Sensor1));
 lcd.print("C");
 }else {
 lcd.setCursor(0, 0);
 lcd.print("T1:");
 lcd.print("AUS   ");}
   
 if (sensors.isConnected(Sensor2)){
   lcd.setCursor(0, 1);
 lcd.print("T2:");
 lcd.print(sensors.getTempC(Sensor2));
 lcd.print("C");
 }else {
   
 lcd.setCursor(0, 1);
 lcd.print("T2:");
 lcd.print("AUS   ");}
 
 if (sensors.isConnected(Sensor3)){
   lcd.setCursor(0, 2);
 lcd.print("T3:");
 lcd.print(sensors.getTempC(Sensor3));
 lcd.print("C");
 }else {
 
 lcd.setCursor(0, 2);
 lcd.print("T3:");
 lcd.print("AUS   ");}
 
 if (sensors.isConnected(Sensor4)){
   lcd.setCursor(0, 3);
 lcd.print("T4:");
 lcd.print(sensors.getTempC(Sensor4));
 lcd.print("C");
 }else {
 lcd.setCursor(0, 3);
 lcd.print("T4:");
 lcd.print("AUS   ");}

 buttonState = digitalRead(knopf1);
 if (buttonState != lastButtonState) {
   if (buttonState == HIGH) {
     buttonPushCounter++;
   }
   else {}
 }
 lastButtonState = buttonState;
 if (buttonPushCounter % 2 == 0) {
   programm1 ();
 } else {
   
 }
}

void programm1 (){
 digitalWrite(k1, HIGH);
if (sensors.getTempC(Sensor3) == 27){
  digitalWrite(k1, LOW);}
 
 else {
digitalWrite(k1, HIGH);
 }
}
 


Was mache ich falsch und wie mache ich das was ich will richtig?

Mfg

strohhirn
Gruß

strohhirn

erni-berni

Hallo strohhirn,
was genau macht denn dein Programm "falsch" oder zumindest unerwartet?
Folgendes fällt mir spontan auf:
Du solltest auf jeden Fall den PushButton entprellen, schau dir dazu mal die Bounce Library an.
Nach dem zweiten Betätigen des Buttons springt das Programm in "programm1", arbeitet es ab und geht dann wieder in die Haupt-loop.
In prgramm1 wird das Relais immer wieder eingeschaltet und nur wenn Sensor3 genau 27 ist wieder abgeschaltet. Hier musst du auf >27 testen.
Was heißt für dich "soll das Programm anhalten"? Anhalten wird das Programm nie, du kannst es höchstens in eine Endlosscheife zwingen, das ist aber sehr unschöne Programmierung.
else{} macht so ziemlich gar nichts, kannst du auch weglassen.
Code: [Select]
if (sensors.isConnected(Sensor1)){
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print(sensors.getTempC(Sensor1));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print("AUS   ");}

das zweimalige positionieren des Cursors kannst du einmal einsparen, wenn du den Befehl lcd.setCursor vor die if-Abfrage setzt.
Es kann sein, dass die Anzeigen auf dem Display sehr schnell wechseln und du dadurch nichts mehr erkennen kannst. Was spricht dagegen die Anzeige nur alle 500ms zu aktualisieren, Während das Programm in dieser Warteschleife loopt, kannst du den Button Status prüfen.
Soviel erst mal als Gedankenanregung. 
Gruß
Reinhard

strohhirn

#2
Sep 14, 2012, 07:32 pm Last Edit: Sep 14, 2012, 07:35 pm by strohhirn Reason: 1
@erni-berni

Also das Programm soll, wenn der arduino an eine stromzufuhr angeschlossen wird, einfach nur dei 4 Temps. anzeigen und wenn ein sensor nicht drin ist soll es aus schreiben.
Wenn ich denn den knopf1 einmal drücke soll das programm1 starten. Es soll erstmal nur das relais k1 einschalten und es bei 27°C(oder höher) ausschalten.Die Temperaturen sollen immer angezeigt werden.
Wenn ich denn während das programm1 läuft nochmal auf den Knopf drücke soll alles wieder aus gehen und das display soll weiterhin die Temps. anzeigen.
Mein problem ist ,dass das relais, wenn ich den arduino anschliese, kurz an und denn wieder aus geht und bei mehrfachem oder einfachem knopfdruck nichts passiert, es bleibt aus.
Und das mit dem Pushbutten entprellen und bounc habe ich auch nicht verstanden.(Bin noch nicht so erfahren im bereich dieser technik und skriptschreibung)

Mfg

strohhirn
Gruß

strohhirn

Udo Klein

Das mit dem Bounce bzw. Prellen ist ein Effekt den ein Schalter eher nicht haben sollte, der aber in der Realität nicht einfach vermieden werden kann. Wenn Du einen Schalter drückst, dann werden die Kontakte aufeinander (oder auseinander) gedrückt. Weil das Kontaktmaterial etwas federt geht dabei der Kontakt in der Regel mehrfach auf und zu. Das kann je nach Schalter eine knappe Millisekunde dauern manchmal aber auch mehr als 10 Millisekunden oder noch viel länger. Wenn Dein Programm schnell genug auf einen Zustandswechsel am IO PIn reagiert wird es deshalb mehr als einen Tastendruck erkennen.

Die Lösungen dagegen nennt man auch "debouncen" oder "entprellen". Eine der einfachsten Lösungen ist es vor dem Auslesen des nächsten Tastendrucks ein paar Millisekunden zu warten (also delay(100)). Das hat allerdings Nachteile wenn man mehr als einen Schalter ausliest oder schnell reagieren können muss.

-Udo
Check out my experiments http://blog.blinkenlight.net

strohhirn

Irgendwie klappts einfach nicht . Wenn das arduino startet geht komischerweise das relais an aber bei 27°C geht es nicht aus wenn ich denn den knopf drücke geht das relais aus und ich kann es nicht wieder anmachen.
Ich hätt nicht gedacht das es so schwer ist einen Startknopf in das programm einzufügen.
Gruß

strohhirn

Go Up