RE: Menüführung über LCD!!!
Probier mal :
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
keine Ahnung ob das was bringt, aber einfach probieren, hatte mit 0x27 auch so meine Probleme keine Anung warum?!
Zwecks programmstruktur über LCD, hab ich da was, allerdings eine andere richtung und mit einem Rotary Encoder. Vielleicht kannst du das ja als Menüstruktur brauchen.
Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int s = 00;
int m = 00;
int h = 00;
long startneu;
long startalt;
//PINBELEGEUNG
//DIGITAL
#define FOCUS_PIN 12
#define SHUTTER_PIN 13
//ANALOG
int LDR, LS, SOUND, PIR;
int LDRSCHW, LSSCHW, SOUNDSCHW, PIRSCHW, INTERVALZEIT, BULBTIME;
unsigned long counterldr, countersound, counterls, counterpir, counterinterval, counterbulb;
int shotdelay = 1000;
int tp;
int timesetting;
//ROTARY
#define PINA 2
#define PINB 7
#define PUSHP 3
#define INTERRUPT 0 // PIN 2
#define INTERRUPTB 1 // PIN 3
volatile boolean turned; // rotary was turned
volatile boolean fired; // knob was pushed
volatile boolean up; // true when turned cw
int CursorLine = 0;
int DisplayFirstLine = 0;
char* MenueLine[] = {" Lichtsensor "," Lichtschranke ",
" Soundsensor "," Bewegungssensor "," Speed Shot ",
" Intervall "," Bulb "," Systemtest "," Einstellungen "};
int MenueItems;
byte BUZ_PIN = 11; // Buzzer
byte BUZ = 1;
// Anzeige der Sonderzeichen
byte darrow[8] = {
B00100,
B00100,
B00100,
B00100,
B10101,
B01110,
B00100,
};
byte uarrow[8] = {
B00100,
B01110,
B10101,
B00100,
B00100,
B00100,
B00100,
};
byte rarrow[8] = {
B00000,
B00100,
B00010,
B11111,
B00010,
B00100,
B00000,
};
byte larrow[8] = {
B00000,
B00100,
B01000,
B11111,
B01000,
B00100,
B00000,
};
byte fullblock[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
byte button[8] = {
B11111,
B10001,
B10001,
B10101,
B10001,
B10001,
B11111,
};
// Interrupt Service Routine for a change to pushpin
void isrp ()
{
if (!digitalRead (PUSHP))
fired = true;
} // end of isr
// Interrupt Service Routine for a change to encoder pin A
void isr ()
{
if (digitalRead (PINA))
up = digitalRead (PINB);
else
up = !digitalRead (PINB);
turned = true;
} // end of isr
void setup ()
{
pinMode(FOCUS_PIN, OUTPUT);
pinMode(SHUTTER_PIN, OUTPUT);
pinMode(BUZ_PIN, OUTPUT);
digitalWrite (PINA, HIGH); // enable pull-ups
digitalWrite (PINB, HIGH);
digitalWrite (PUSHP, HIGH);
attachInterrupt (INTERRUPT, isr, CHANGE); // interrupt 0 is pin 2
attachInterrupt (INTERRUPTB, isrp, FALLING); // interrupt 5 is pin 18
lcd.begin (20,4);
lcd.backlight();
lcd.createChar(0, darrow);
lcd.createChar(1, uarrow);
lcd.createChar(2, larrow);
lcd.createChar(3, rarrow);
lcd.createChar(4, fullblock);
lcd.createChar(5, button);
/*lcd.setCursor(0,0);
lcd.print(" DSLR Trigger Box ");
lcd.setCursor(0,1);
lcd.print("Software Version 2.2");
lcd.setCursor(0,2);
lcd.print(" 15-12-2013 ");
lcd.setCursor(0,3);
lcd.print("Written by Daniel A.");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INFO @ 0171/1798546");
lcd.setCursor(0, 2);
lcd.print("Starting EOS TRIGGER");
lcd.setCursor(0, 3);
for (int i=0; i<20; i++){
lcd.write((byte)4);
delay(150);}*/
MenueItems = sizeof(MenueLine)/sizeof(MenueLine[0]);
lcd.clear();
print_menue();
} // end of setup
void loop ()
{
if (turned)
{
if (up)
move_up();
else
move_down();
turned = false;
}
else if (fired)
{
selection();
fired = false;
} // end if fired
} // end of loop
void print_menue() {
tp = 0;
for (int i=0;i<4;i++) {
lcd.setCursor(0,i);
lcd.print(MenueLine[DisplayFirstLine + i]);
}
lcd.setCursor(0,(CursorLine-DisplayFirstLine));
lcd.write((byte)3);
}
void move_down() {
if (CursorLine == (DisplayFirstLine+4-1)) {
DisplayFirstLine++;
}
if (CursorLine == (MenueItems-1)) {
CursorLine = 0;
DisplayFirstLine = 0;
}
else {
CursorLine=CursorLine+1;
}
print_menue();
}
void move_up() {
if ((DisplayFirstLine == 0) & (CursorLine == 0)) {
DisplayFirstLine = MenueItems-4;
}
else if (DisplayFirstLine == CursorLine) {
DisplayFirstLine--;
}
if (CursorLine == 0) {
CursorLine = MenueItems-1;
}
else {
CursorLine=CursorLine-1;
}
print_menue();
}
void selection() {
/* lcd.clear();
lcd.print("Menueauswahl Nr: ");
lcd.print(CursorLine);
lcd.setCursor(4,1);
lcd.write((byte)0);
lcd.print(" ");
lcd.write((byte)0);
delay(100);
while(digitalRead(PUSHP)); */
switch (CursorLine) {
case 0:
light_flashset();
break;
case 1:
lsset();
break;
case 2:
soundset();
break;
case 3:
pirset();
break;
case 4:
manuell();
break;
case 5:
intervallset();
break;
case 6:
bulbset();
break;
case 7:
screentest();
break;
case 8:
settings();
break;
default:
break;
}
print_menue();
}
//MENÜS UND SUBMENÜS
void intervallset(){
delay(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Interval Set");
lcd.setCursor(0, 1);
lcd.print("Set 1 sec - 9999 sec");
do{
if (turned){
if (up){
counterinterval--;}
else{
counterinterval++;
}
turned = false;
}
INTERVALZEIT = counterinterval;
lcd.setCursor(0, 3);
lcd.print("Interval: ");
lcd.print(INTERVALZEIT);
lcd.print(" sec ");
}
while(digitalRead(PUSHP));
{
interval();
}
}
void interval(){
delay(150);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Interval Mode");
lcd.setCursor(0,1);
lcd.print("Intervaltime: ");
lcd.print(INTERVALZEIT);
lcd.print(" sec");
do{
startneu = (millis() - startalt) / 1000;
if ( startneu >= INTERVALZEIT){
shutter();
startalt = millis();
}
lcd.setCursor(0,2);
lcd.print("Passed: ");
lcd.print(startneu +1);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print("Pics: ");
lcd.print(tp);
lcd.print(" ");
}
while(digitalRead(PUSHP));
{
print_menue();
}
}
void light_flashset(){
delay(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Blitzsensor Set");
lcd.setCursor(0, 1);
lcd.print("Setting von 0 - 1020");
do{
if (turned){
if (up){
counterldr-=20;}
else{
counterldr+=20;}
}
turned = false;
LDRSCHW = counterldr;
lcd.setCursor(0, 3);
lcd.print("Ist: ");
lcd.print(analogRead(A0));
lcd.print(" ");
lcd.setCursor(10, 3);
lcd.print("Soll: ");
lcd.print(LDRSCHW);
lcd.print(" ");
lcd.setCursor(12, 3);
}
while(digitalRead(PUSHP));
{
light();
}
}
void light(){
delay(150);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Light laeuft");
do{
lcd.setCursor(0,1);
lcd.print("Ist: ");
lcd.print(analogRead(A0));
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print("Soll: ");
lcd.print(LDRSCHW);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Pics: ");
lcd.print(tp);
lcd.print(" ");
if (analogRead(A0) >= LDRSCHW){
shutter();
}
}
while(digitalRead(PUSHP));
{
print_menue();
tp = 0;
}
}
void soundset(){
delay(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sound Set");
lcd.setCursor(0, 1);
lcd.print("Setting von 0 - 1023");
do{
if (turned){
if (up){
countersound-=10;}
else{
countersound+=10;
}
turned = false;
}
SOUNDSCHW = countersound;
lcd.setCursor(0, 2);
lcd.print("Ist: ");
lcd.print(analogRead(A2));
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Soll: ");
lcd.print(SOUNDSCHW);
lcd.print(" ");
lcd.setCursor(12, 3);
}
while(digitalRead(PUSHP));
{
sound();
}
}
void sound(){
delay(150);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sound laeuft");
do{
lcd.setCursor(0,1);
lcd.print("Ist: ");
lcd.print(analogRead(A2));
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print("Soll: ");
lcd.print(SOUNDSCHW);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Pics: ");
lcd.print(tp);
lcd.print(" ");
if (analogRead(A2) >= SOUNDSCHW){
shutter();
}
}
while(digitalRead(PUSHP));
{
print_menue();
tp = 0;
}
}
void pirset(){
}
void bulbset(){
delay(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bulb Set");
do{
if (turned){
if (up){
counterbulb--;}
else{
counterbulb++;
}
turned = false;
}
BULBTIME = counterbulb;
lcd.setCursor(0, 2);
lcd.print("Time Set: ");
lcd.print(BULBTIME);
lcd.print(" sec ");
}
while(digitalRead(PUSHP));
{
timesetting = BULBTIME;
bulb();
}
}
void bulb(){
delay(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bulb Mode");
do{
delay(1000);
s = s+1;
if(s>59){m=m+1; s=00;}
if(m>59){h=h+1; m=00;}
lcd.setCursor(0, 3);
lcd.print("Time: ");
lcd.print(h);
printDigits(m);
printDigits(s);
}
while(digitalRead(PUSHP));
{
print_menue();
}
}
void manuell(){
shutter();
}
void lsset(){
delay(150);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lichtschranke Set");
do{
if (turned){
if (up){
counterls-=10;}
else{
counterls+=10;
}
turned = false;
}
LSSCHW = counterls;
lcd.setCursor(0, 2);
lcd.print("Ist: ");
lcd.print(analogRead(A1));
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Soll: ");
lcd.print(LSSCHW);
lcd.print(" ");
lcd.setCursor(12, 3);
}
while(digitalRead(PUSHP));
{
ls();
}
}
void ls(){
delay(150);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Lichtschranke");
do{
lcd.setCursor(0,1);
lcd.print("Ist: ");
lcd.print(analogRead(A1));
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print("Soll: ");
lcd.print(LSSCHW);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Pics: ");
lcd.print(tp);
lcd.print(" ");
if (analogRead(A1) <= LSSCHW){
shutter();
}
}
while(digitalRead(PUSHP));
{
print_menue();
tp = 0;
}
}
void mainscreen(){
lcd.clear();
lcd.setCursor(0,0);
for (int i=0; i<20; i++){
lcd.write((byte)4);
delay(50);}
lcd.setCursor(2,1);
lcd.write((byte)0);
lcd.print("Push The Button");
lcd.setCursor(2,2);
lcd.write((byte)5);
while(digitalRead(PUSHP));
lcd.noBlink();
{
print_menue();
}
}
void screentest(){
for (int i=0; i<80; i++){
lcd.write((byte)4);
delay(50);}
for (int t=0; t<5; t++){
lcd.noBacklight();
delay(250);
lcd.backlight();
delay(250);
lcd.setCursor(2,1);
lcd.write((byte)0);
lcd.print("Push The Button");
lcd.setCursor(2,2);
lcd.write((byte)5);}
while(digitalRead(PUSHP));
print_menue();
}
void shutter(){
digitalWrite(SHUTTER_PIN, HIGH);
if (BUZ == 1) {
digitalWrite(BUZ_PIN,HIGH);
delay(30);
digitalWrite(BUZ_PIN, LOW);
delay(60);
digitalWrite(BUZ_PIN,HIGH);
delay(30);
digitalWrite(BUZ_PIN, LOW);
} else {
digitalWrite(BUZ_PIN, LOW);
}
digitalWrite(SHUTTER_PIN, LOW);
delay(shotdelay);
tp++;
}
void settings(){
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Shotdelay: ");
lcd.setCursor(0, 3);
lcd.print("Buzzer: ");
do{
if (turned){
if (up){
shotdelay-=100;}
else{
shotdelay+=100;
}
turned = false;
}
lcd.setCursor(11,0);
lcd.print(shotdelay);
lcd.print(" ");
}
while(digitalRead(PUSHP));
delay(150);
do{
if (turned){
if (up){
BUZ=0;}
else{
BUZ=1;
}
turned = false;
}
lcd.setCursor(11,3);
lcd.print(BUZ);
lcd.print("");
}
while(digitalRead(PUSHP));
print_menue();
}
void printDigits(int digits)
{
// utility function for digital clock display: prints preceding colon and leading 0
lcd.print(':');
if(digits < 10)
lcd.print('0');
lcd.print(digits);
}
Greez
|