gut, ausgelacht wird hier ja hoffentich keiner, für seinen anfängermäßig-unnötig-kompliziert geschriebenen code!
zur Erklärung: Der Sketch steuert das dfrobot lcd-shield (16x2) und ein 16-Kanal Relais-Board.
Das ganze soll wenn es fertig ist ein elektronisches Feuerwerks-Zündsystem werden.
Das elektronische Zündsystem existiert schon länger und wurde bisher einfach per knopfdruck für jeden einzelnen Kanal ausgelöst. In Zukunft soll es dann automatisiert ablaufen.
Sowas gibt es zwar für vergleichsweise wenig Geld auch fertig zu kaufen, aber wer fertige Lösungen bevorzugt, hält sich bestimmt nicht hier im Forum auf!
der code ist teilweise aus allen möglichen Quellen "zusammengeklaut" somit erklären sich die teilweise komischen bezeichnungen.
wenn erst mal alles läuft pass ich das dann noch an.
Wenn jemand allgemeine verbesserungstips hat, nehme ich die natürlich auch gerne an!!!
/*
Feuerwerk
Zündung
*/
int Kanal1 = 2;
int Kanal2 = 3;
int Kanal3 = 11;
int Kanal4 = 12;
int Kanal5 = 13;
int Kanal6 = A1;
int Kanal7 = A2;
int ModulA = A3;
int ModulB = A4;
int ModulC = A5;
int Kanal[21] ={Kanal1, Kanal2, Kanal3, Kanal4, Kanal5, Kanal6, Kanal7, Kanal1, Kanal2, Kanal3, Kanal4, Kanal5, Kanal6, Kanal7, Kanal1, Kanal2, Kanal3, Kanal4, Kanal5, Kanal6, Kanal7};
int Modul[21] ={ModulA, ModulA, ModulA, ModulA, ModulA, ModulA, ModulA, ModulB, ModulB, ModulB, ModulB, ModulB, ModulB, ModulB, ModulC, ModulC, ModulC, ModulC, ModulC, ModulC, ModulC};
int i = 0;
int zuendungen = 0;
int anzahlzuender = 7;
int UhrenStart = 0;
int Start = 0;
#include <LiquidCrystal.h>
#include <Time.h>
unsigned long prev_time1;
unsigned long prev_time2;
unsigned long feuerdauer;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Define some values used by the LCD panel and buttons:
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
unsigned int Ende = 0;
unsigned int Pause = 0;
unsigned int naechsterzuender = 1;
unsigned int Feuer = 1;
time_t t;
time_t dif;
time_t z[7] ={5,10,15,20,25,30,35};
void setup() {
// initialize the digital pin as an output.
lcd.begin(16, 2);
pinMode(Kanal1, OUTPUT);
pinMode(Kanal2, OUTPUT);
pinMode(Kanal3, OUTPUT);
pinMode(Kanal4, OUTPUT);
pinMode(Kanal5, OUTPUT);
pinMode(Kanal6, OUTPUT);
pinMode(ModulA, OUTPUT);
pinMode(ModulB, OUTPUT);
pinMode(ModulC, OUTPUT);
lcd.setCursor(0,0); // 1st char in 1st line
lcd.print("Start Show?");
prev_time1=millis();
}
void loop() {
readButtons();
if(adc_key_in < 790) //Select-taste gedrückt
{
Start++;
}
if(Start >= 1 && Ende == 0)
{
if(UhrenStart == 0)
{
lcd.clear();
setTime(0,0,0,1,1,1970);
UhrenStart++;
}
if((millis()-prev_time1)>999 && Pause == 0)
{
digitalUhrAnzeige(); // ruft Uhren-Subroutine im Sekeundentakt auf
prev_time1=millis();
}
if (Pause == 0)
{
Feuerwerk();} //Subroutine-Feuerwerk
}
if (adc_key_in < 555) //Left, bzw. PauseTaste
{
Pause = 1;
time_t t = now();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("mit Zuender ");
lcd.setCursor(11,0);
lcd.print(" ");
lcd.print(Feuer);
lcd.setCursor(0,1);
lcd.print("weiter?");
lcd.print(" ");
printZiffernGenulltOhnePunkt(minute(t));
printZiffernGenulltmitPunkt(second(t));
}
if (adc_key_in < 50) // Right, bzw. WeiterTaste
{
lcd.clear();
Pause = 0;
setTime(t);
lcd.setCursor(0, 1);
lcd.print(" Zuender");
lcd.print(Feuer);
}
if((millis()-prev_time2)>1000 && Pause == 0 && Ende ==0 && Start >= 1)
{
Countdown(); // ruft Countdown-Subroutine im Sekeundentakt auf
prev_time2=millis();
}
}
void Feuerwerk() //Subroutine für Feuerwerk
{
if(i == 0)
{
lcd.setCursor(0, 1);
lcd.print(" Zuender");
lcd.print(Feuer);
}
if(now() == z[i] && zuendungen <= anzahlzuender)
{
lcd.setCursor(0, 1);
lcd.print("Feuer");
lcd.print(Feuer);
feuerdauer=millis();
while(millis() - feuerdauer < 30)
{
digitalWrite(Kanal[i], HIGH);
digitalWrite(Modul[i], HIGH);
}
//schaltet nach 30ms Zündung aus
digitalWrite(Kanal[i], LOW);
digitalWrite(Modul[i], LOW);
Feuer ++;
zuendungen ++;
i=i+1;
}
if(now()==(z[i-1]+1)) //entfernt letztes Feuer und zeigt neues Feuer
{
lcd.setCursor(0, 1);
lcd.print(" Zuender");
lcd.print(Feuer);
}
if(now() == (z[(anzahlzuender-1)]+2))
{ //entfernt letztes Feuer und zeigt neues Feuer
lcd.setCursor(7,0);
lcd.print(" Ende ");
lcd.setCursor(0, 1);
printZiffernGenulltOhnePunkt(Feuer);
lcd.print(" Zuendungen ");
Ende++;
}
}
void digitalUhrAnzeige() // definieren Subroutine
{
// digitale Anzeige der Zeit
lcd.setCursor(0, 0); // positionieren LCD-Cursor, 1. Zeile, 1. Spalte
printZiffernGenulltOhnePunkt(minute()); // rufen Subroutine auf
printZiffernGenulltmitPunkt(second()); // rufen Subroutine auf
}
void printZiffernGenulltOhnePunkt(int zahl) // definiert Subroutine
{
// verschoenern Anzeige, indem wir ...
if(zahl < 10) // wenn kleiner als 10 ...
{
lcd.print("0");
}
lcd.print(zahl);
}
void printZiffernGenulltmitPunkt(int zahl) // definiert Subroutine
{
// verschoenern Anzeige, indem wir ...
lcd.print(":");
if(zahl < 10) // wenn kleiner als 10 ...
{
lcd.print('0');
}
lcd.print(zahl);
}
void Countdown()
{
time_t dif=z[i]-now();
lcd.setCursor(11,0);
printZiffernGenulltOhnePunkt(dif);
}
void readButtons(){
// Read Buttons from analog port
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // perform button action
{
/*case btnRIGHT:
{
lcd.setCursor(11,0);
lcd.print("Pause");
break;
}
case btnLEFT:
{
lcd.setCursor(13,0);
lcd.print("LFT");
break;
}
case btnUP:
{
lcd.setCursor(13,0);
lcd.print("UP ");
break;
}
case btnDOWN:
{
lcd.setCursor(13,0);
lcd.print("DWN");
break;
}
case btnSELECT:
{
lcd.setCursor(11,0);
lcd.print("Start");
break;
}
case btnNONE:
{
lcd.setCursor(11,0);
lcd.print(" ");
break;
}*/
}
}
// Read the buttons from analog interface:
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // when all others fail, return this...
}