Code Teil 1:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ersteller: Bananenmilch //
//letzes Datum:11.04.2016 //
//Name: Zeitschaltuhr mit Display //
//Details: Es ist Ratsam erst die Start und die Stopzeit einzustellen, da sich die momentane Zeit "resettet" //
// 1. Dieses Programm steuert eine Funksteckdose mittels eines angeschlossenen RC-Sender //
// Es bietet weiterhin die möglichkeit Zeiten via Displayshield einzugeben. //
// Um die Momentane Uhrzeit einzustellen muss mitells "Up" oder "Down" das Menü "Momentane Zeitausgewählt" werden.Dazu muss"Select" betätigt werden. //
// Durch Drücken der "Up" Taste können die Stunden +1 gezählt werden. Mit betätigung der "Right Taste" kann auf Minuten umgeschaltet werden. //
// Mit erneutem Drücken der "Right" taste wird das einstellungsmenü beendet. //
// Mit "Left" kann das Menü abgebrochen werden. //
// 2.Um Start und Stop- Zeit einzustellen muss wie in 1. vorgegangen werden. //
// 3.Um alle Funktionen Nutzen zu können muss ledigleich ein RC-Funkmodul angeschlossen werden.Datenpin ist hierbei pin 6. //
// 4.Zusätzlich wird ein Displayshield benötigt um die eingaben zu tätigen. //
// //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <GSM.h>
#include <RCSwitch.h> //RC Modul Library
#include <Time.h> //Time Library
#include <TimeLib.h> // -/-
#include <LiquidCrystal.h>//Library für LCD Display
#include <sainsmartkeypad.h>//library für Displayshield ( PWM)
////// ######################## DEFINITION GLOBALER VARIABLEN ##############///////////////////////////////
#define PIN ""
#define LED_GRUEN 15 //PIN 15 --> PIN A1 Steuert die GRUENE LED bei SMS und steuert das Funkmodul an --> Einschaltbefehl
#define LED_ORANGE 16 //PIN 16 --> PIN A2 Steuert die Orangene LED bei SMS und symbolisiert Fehlerhaft gesendete Symbole
#define LED_ROT 17 //PIN 17 --> PIN A3 Steuert die ROTE LED bei SMS und steuert das Funkmodul an --> Ausschaltbefehl
///////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////Custom Chars um Sendeaktivität zu indizieren
byte customCharsend[8] = {
0b00000,
0b01110,
0b10001,
0b00100,
0b01010,
0b00000,
0b00100,
0b00000
};
byte customCharnosend[8] = {
0b00000,
0b01110,
0b10011,
0b10101,
0b11001,
0b01110,
0b00000,
0b00000
};
byte customCharCursor[8] = {
0b11111,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
//######################INSTANZEN DER BIBLIOTHEKEN INITIALISIEREN#######
RCSwitch mySwitch = RCSwitch();//Sendemodul initialisieren
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//LCD initialisieren
SainsmartKeypad keypad(0);//Keypad initialisieren
GSM gsmAccess;
GSM_SMS sms;
// ############ GLOBALE VARIABLEN #################
// ----------- Variablen Funksteuerung & Zeitschaltuhr --------------
unsigned long anzeige2; // Variable um Stunden in den untermenüs auszugeben
unsigned long hour1=0; //Variablen zum Speichern der momentanen Uhrzeit
unsigned long min1;
unsigned long sek1;
int hourvergleich=0;
int minvergleich=0;
//Startzeit
unsigned long anzeige3;// Variable um Stunden in den untermenüs auszugeben
unsigned long hour2; //Variablen zum Speichern der momentanen Uhrzeit
unsigned long min2;
unsigned long sek2;
//endzeit
unsigned long anzeige4;// Variable um Stunden in den untermenüs auszugeben
unsigned long hour3; //Variablen zum Speichern der momentanen Uhrzeit
unsigned long min3;
unsigned long sek3;
//Abzug millis()
unsigned long prev_millis = 0;// wird benötigt um die im Menü verbrachte zeit zu neutralisieren.
unsigned long sek = 0; // Speichert die seit Systemstart vergangenen Sekunden
////Vars Menü und Tastenabfrage
char taste; //Speichert die gedrückte Taste zwischen.(String)
int modus = 1; //Auswahlvariable für Hauptmenü
int modus2 = 0; //Auswahlvariable für Untermenüs
int keypad_pin = A0; //Variable um den Analog wert des Displays abzuspeichern
static enum {UNDEF,AUS,EIN} flag_old=UNDEF;
// ----------- Variablen GSM --------------
char SENDERNUMMER[20]; // Dient zum Ausgeben/ Speichern der Sendernummer
unsigned long TIME_BEFORE = 0; // Steuert die Leuchtzeit der LED. Speichert die vorherige Zeit.
const long LED_INTERVAL = 5000; // Leuchtdauer der LED in
// #################### VOID SETUP #########################
void setup() {
// -- Variavlendeklaration innerhalb Void Setup --
lcd.begin(16, 2); // Bekanntgabe um welche Art Display es sich handelt 2Zeilen 16 Zeichen
lcd.clear(); //Löscht Bildschirm ausgaben
lcd.createChar(0, customCharsend);// Zuordnung der erstellten Spezialzeiche (senden)
lcd.createChar(1, customCharnosend);//Zuordnung der erstellten Spezialzeichen(nicht senden)
lcd.createChar(2, customCharCursor);//Cursor
mySwitch.enableTransmit(6);//Festlegen des Datenpin für RC Funkmodul
//Initialisiert die GPIOs
pinMode(LED_GRUEN, OUTPUT);
pinMode(LED_ORANGE, OUTPUT);
pinMode(LED_ROT, OUTPUT);
// Initialisiert die Serielle Schnittstelle
LOAD_SERIAL_INT(); // Lädt die Serielle Schnittstelle für Kontrollausgaben -- bei Fertigstellung nicht mehr relevant
Serial.println("Serielle Schnittstelle geladen"); //Kontrollausgabe
// Prüfen des SIM-Karten Status
// PIN_CHECK_FKT(); --Library fehlerhaft, deshalb vorerst nicht verwendet
LOAD_GSM_INT(); // -- Lädt die GSM Schnittstelle und prüft die Verbindung
Serial.println("GSM: Verbindung hergestellt."); // Kontrollausgabe
// Arduino Bereit
ARDUINO_RDY(); // Lässt alle LEDs einmal aufblinken als Zeichen, dass nun empfangen wird
Serial.println("Warte auf SMS"); // Kontrollausgabe
sms.flush();
}
// #################### VOID LOOP #########################
void loop() {
// Variablendeklaration
unsigned long TIME_NOW=0;hor2
sek = seconds(hour1, min1, sek1);//Umwandeln der Momanten eingestellten Zeit in Sekunden
taste = ReadKeypad();//Lesen der gedrückten taste
waitbutton();//Warten auf loslassen der Taste( gepfuschtes entprellen)
//Auswahl des Menüs zum einstellen von "mom. Stunden Start & Stopzeit"
modus=FKT_MENU(taste,modus); // Mit den Tasten Down,Up, Left, Right wird im Menü geblättert.
FKT_MODUS(sek,modus,TIME_NOW); // Menüeinstellung, Ein- & Ausschaltzeit einstellen
//Verarbeiten einer empfangenen SMS
if (sms.available())
{
SMS_VERARBEITEN(); // Wertet die SMS aus und sendet Steuerbefehle an die Funksteckdose
}
// Steuerung Orangene LED, um falsch gesendete Zeichen zu melden (Bestandteil der Anweisungen zu 'Verarbeiten einer gesendeten SMS')
TIME_NOW=millis();
if(TIME_NOW<(TIME_BEFORE+LED_INTERVAL))
digitalWrite(LED_ORANGE, HIGH);
else
digitalWrite(LED_ORANGE, LOW);
}