Hallo liebes Forum. ich habe schon vor längeren angefangen am Arduino zu Programmieren und mich mit der Zeit an immer größeren Projekten Probiert. Mein derzeitiges Projekt handelt sich um einen Temperofen. Ich habe bereits einen Sketch geschrieben welcher auch mit der millis Aktion funktioniert. Mein Problem liegt in der Umsetzung folgender Punkte:
- Aufbau eines Menüs, mit mehreren Programmen
- Aufgabe eines Programmes soll es sein die Temperatur einen Sensors Abzufragen und Halbstündlich durch zuschalten von Heizelementen die Temperatur um 5C zu erhöhen, bis beispielsweise 60C erreicht sind, und diese dann für 6 Stunden halten.
- Das ganze für ca 5 Programme die alle verschiedene Endtemperaturen und Laufzeiten haben(nur die Aufheizzeit bleibt gleich)
Hier der erste sketch den ich geschrieben habe. Dieser Funktioniert soweit, bloß das das Programm nach starten des Arduinos sofort startet, und keine anderen Programme ausgewählt werden können.( Zeiten und Temperaturen stimmen noch nicht mit dem oben geschriebenen überein, da es nur zum testen gedacht ist.
#include<dht11.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte punkt [8] = {B00110,B01001,B01001,B00110,B00000,B00000,B00000,B00000,};
byte voll [8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111,};
#define dht_dpin 8
dht11 DHT1;
#define Initialisieren 5000UL
#define laufzeit_1 60000UL //Heizen 1
#define laufzeit_2 120000UL //Heizen 2
#define laufzeit_3 180000UL //Heizen 3
#define laufzeit_4 240000UL //Halten
#define laufzeit_5 300000UL //Kühlen 1
#define laufzeit_6 360000UL //Kühlen 2
#define laufzeit_7 420000UL //Kühlen 3
unsigned long time;
unsigned long StartMonitor = 0;
int Heat1 = 22;
int Heat2 = 24;
int Heat3 = 26;
int Heat4 = 28;
int Steuerung1 = 42;
int Steuerung2 = 43;
int Steuerung3 = 44;
int Steuerung4 = 45;
int SteuerungA = 50;
int SteuerungB = 51;
int SteuerungC = 52;
int SteuerungD = 53;
void setup()
{
Serial.begin(9600);
pinMode(SteuerungA, INPUT);
pinMode(SteuerungB, INPUT);
pinMode(SteuerungC, INPUT);
pinMode(SteuerungD, INPUT);
pinMode(Steuerung1, OUTPUT);
pinMode(Steuerung2, OUTPUT);
pinMode(Steuerung3, OUTPUT);
pinMode(Steuerung4, OUTPUT);
pinMode(Heat1, OUTPUT);
pinMode(Heat2, OUTPUT);
pinMode(Heat3, OUTPUT);
pinMode(Heat4, OUTPUT);
lcd.begin(20,4);
lcd.createChar (1, punkt);
lcd.createChar (2, voll);
lcd.clear();
lcd.setCursor(5,1);
lcd.print("Temperofen");
delay(5000);
lcd.clear();
}
void loop()
{
DHT1.read(dht_dpin);
int temp = DHT1.temperature;
lcd.setCursor ( 0 , 0 );
lcd.print("Temp ist :");
lcd.print((float)DHT1.temperature, 0);
lcd.setCursor(15,0);
lcd.write(1);
lcd.print("C");
lcd.setCursor ( 0 , 1 );
lcd.print("Temp soll:");
lcd.setCursor(15,1);
lcd.write(1);
lcd.print("C");
delay(1000);
//Programmablauf--------------------------------------------------------------------------------------------------
if (millis() <= laufzeit_1) {digitalWrite (Steuerung1, HIGH);}
if (millis() >= laufzeit_1) {digitalWrite (Steuerung2, HIGH); digitalWrite (Steuerung1, LOW);}
if (millis() >= laufzeit_2) {digitalWrite (Steuerung3, HIGH); digitalWrite (Steuerung2, LOW);}
if (millis() >= laufzeit_3) {digitalWrite (Steuerung4, HIGH); digitalWrite (Steuerung3, LOW);}
if (millis() >= laufzeit_4) {digitalWrite (Steuerung3, HIGH); digitalWrite (Steuerung4, LOW);}
if (millis() >= laufzeit_5) {digitalWrite (Steuerung2, HIGH); digitalWrite (Steuerung3, LOW);}
if (millis() >= laufzeit_6) {digitalWrite (Steuerung1, HIGH); digitalWrite (Steuerung2, LOW);}
if (millis() >= laufzeit_7) {digitalWrite (Steuerung1, LOW);}
//Heizstufe 1-----------------------------------------------------------------------------------------------------
if (digitalRead(SteuerungA) == HIGH && temp <= 21)
{
digitalWrite (Heat1, HIGH);
lcd.setCursor ( 10 , 1 );
lcd.print("22");
}
else if (digitalRead(SteuerungA) == LOW || temp >= 22)
{
digitalWrite (Heat1, LOW);
}
//Heizstufe 2-----------------------------------------------------------------------------------------------------
if (digitalRead(SteuerungB) == HIGH && temp <= 24)
{
digitalWrite (Heat1, HIGH);
digitalWrite (Heat2, HIGH);
lcd.setCursor ( 10 , 1 );
lcd.print("25");
}
else if(digitalRead(SteuerungB) == LOW || temp >= 25)
{
digitalWrite (Heat2, LOW);
}
//Heizstufe 3-----------------------------------------------------------------------------------------------------
if (digitalRead(SteuerungC) == HIGH && temp <= 27)
{
digitalWrite (Heat1, HIGH);
digitalWrite (Heat2, HIGH);
digitalWrite (Heat3, HIGH);
lcd.setCursor ( 10 , 1 );
lcd.print("28");
}
else if(digitalRead(SteuerungC) == LOW || temp >= 28)
{
digitalWrite (Heat3, LOW);
}
//Heizstufe 4-----------------------------------------------------------------------------------------------------
if (digitalRead(SteuerungD) == HIGH && temp <= 30)
{
digitalWrite (Heat1, HIGH);
digitalWrite (Heat2, HIGH);
digitalWrite (Heat3, HIGH);
digitalWrite (Heat4, HIGH);
lcd.setCursor ( 10,1 );
lcd.print("31");
}
else if(digitalRead(SteuerungD) == LOW || temp >= 31)
{
digitalWrite (Heat4, LOW);
}
temp= map(DHT1.temperature, 0, 410, -50, 150);
if (millis() - StartMonitor >= Initialisieren) {
StartMonitor = millis();
Serial.print(DHT1.temperature);
Serial.println(" Grad Celsius");
}
}
Außerdem mein erster Test eine Menüstruktur mit der millis Funktion zu vereinen. Daran bin ich leider gescheitert. Das Menü wird zwar richtig angezeigt, aber bei der Auswahl des Menüpunkts passiert nichts. Ich möchte keinen fertigen Sketch, aber über ein einfaches Beispiel anhand meines Sketchs mit einer kleinen Erklärung, warum was so geschrieben wird wäre ich sehr Dankbar. Bitte verurteilt mich nicht, da ich seit Tagen im Netz nach Lösungen suche aber nicht verstehe wie ich millis richtig einsetzte bzw verwende.
#include <LiquidCrystal.h>
#include <Menu.h>
#include <MenuItem.h>
LiquidCrystal lcd(7,6,5,4,3,2);
Menu myMenu;
// Name Number For Back up down
MenuItem item100("Start ", 100, 101, 102, 100, 100);
MenuItem item101("Programm 1", 101, 102, 100, 101, 101);
MenuItem item102("Programm 2", 102, 100, 101, 102, 102);
int readButton; // Variable to store the last pressed Button
int select;
#define Timer_1 2000UL
#define Timer_2 6000UL
#define Timer_3 63000UL
unsigned long time;
unsigned long startzeit_1 = 0;
void Programm1(){
lcd.clear();
lcd.print("programm 1");
if (millis() - startzeit_1 <= Timer_1) {
startzeit_1 = millis();
digitalWrite(24, HIGH);}
if (millis() - startzeit_1 >= Timer_2) {
startzeit_1 = millis();
digitalWrite(24, LOW);
delay(2000);
myMenu.begin(100);}
}
void Programm2(){
lcd.clear();
lcd.print("Programm 2");
digitalWrite(26, HIGH);
delay(3000);
digitalWrite(26, LOW);
delay(100);
lcd.clear();
myMenu.begin(100);
}
void setup(){
Serial.begin(9600);
myMenu.addLCD(&lcd);
myMenu.addItem(item100);
myMenu.addItem(item101);
myMenu.addItem(item102);
lcd.begin(16, 2);
lcd.print("Temperofen");
delay(2000);
myMenu.begin(100); // Start at the Menu with at the MenuItem you want
pinMode(24, OUTPUT);
pinMode(26, OUTPUT);
pinMode(28, OUTPUT);
pinMode(30, OUTPUT);
pinMode(51,INPUT);
pinMode(52,INPUT);
pinMode(53,INPUT);
}
void loop(){
readButton = analogRead(0); // read the value from a pushed button
if(digitalRead(53) == HIGH){
myMenu.goForward();
}
if(digitalRead(51) == HIGH){
myMenu.goBack();
}
if(digitalRead(52) == HIGH){
select = myMenu.select(); //use select() to check if the item you are at has a runable function
switch(select){
case 101: //if found a funtion for a item run it
Programm1();
break;
case 102: //if found a funtion for a item run it
Programm2();
break;
default:
break;
}
}
readButton = 1000;
}