Programm und LCD-Menu verbinden

Guten Morgen,

meinen ersten Beitrag schreibe ich aus Verzweiflung.

Ich bin zwar ein ziemlich guter Feinmechaniker, komme aber bei Elektronik über allereinfachste Verstärkerschaltungen nicht hinweg, und mit Programmieren stand ich schon während des Studiums vor ca. 40 Jahren auf Kriegsfuss.

Trotzdem habe ich vor etwa 3 Wochen angefangen, mich mit Arduino zu beschäftigen. Nicht, weil ich unbedingt will, sondern weil es für einige meiner fotografischen Bauprojekte vorteilhaft ist.

Mittlerweile bin ich in der Lage, einfachere Programme zu schreiben, die auch tun, was ich will. Allerdings muss ich Parameter am PC ändern, brauche aber mittelfristig Stand-Alone- Lösungen.

LCD läuft auch, und ich weiss auch, wie man in den allgegenwärtigen Menuvorschlägen den LCD und die Pins ggf. anpasst. Soweit, so gut.

Wo ich aber absolut auf Grund laufe, ist die Verbindung von Menu und Programm. Das Kochbuch schweigt sich dazu genauso aus, wie die Internetsuche. Mit den entsprechenden Schlagworten finde ich auch hier im Forum nichts. Aber irgendwie müsst ihr das ja auch geschafft haben.

Bitte deshalb dringend, mir aufs Pferd zu helfen! Artikel in Englisch sind kein Problem, aber bitte keine Hinweise auf weitere Sprachen.

Schon mal vielen Dank für eure Hilfe

Bernhard

Meinst du sowas?
http://forum.arduino.cc/index.php?topic=73816.0

Du erklährst Dein Problem sehr abstrakt.
Gib uns mehr info: Welches Display, den Sketch den Du schon hast ecc.
Grüße Uwe

Tsts, ich hatte ebenfalls auf den Beitrag geantwortet. Aber anstelle die Meldung zu bekommen, dass es zwischenzeitlich weitere Antworten gab, wurde meine Antwort einfach verworfen.

Prima neue Forumsoftware.

Wie auch immer. Eine Liste der UI Libs gibt es hier:
http://playground.arduino.cc/Main/InterfacingWithHardware#ui

Oliver

Erst mal danke für eure schnellen Antworten.
@ sschultewolter:
Beispielmenus, die man dann erweitern kann, finden sich ja genügend.

@uwefed:
Ja, ich erkläre das ziemlich abstrakt, da ich das Problem generell lösen will. aber ich kann gerne ein praktisches Beispiel geben:

Im ersten Teil alle Includes etc. und dann ein angepasstes Menu, welches für mein Programm ausreichend wäre (Ich könnte im Programm einen Schritt heausnehmen bei einer Stand Alone Lösung).

#include <Stepper.h>

#include <LiquidCrystal.h>
#include <SimpleUI16x2.h>

//CONFIGURATION/////////////////////////////////////////////
LiquidCrystal lcd(8,9,4,5,6,7);
SimpleUI16x2 simpleui(&lcd,getButton);

//declare variables for the motor pins
int motorPin1 = 0;   // Blue   - 28BYJ48 pin 1
int motorPin2 = 1;   // Pink   - 28BYJ48 pin 2
int motorPin3 = 2;   // Yellow - 28BYJ48 pin 3
int motorPin4 = 3;   // Orange - 28BYJ48 pin 4
                       // Red    - 28BYJ48 pin 5 (VCC)
int ledPin = 13; //Ausloeser fuer kamera

int sensorPin = A1;
int sensorValue = 0;



#define STEPS  2048   //Number of steps per revolution

//The pin connections need to be 4 pins connected
// to Motor Driver In1, In2, In3, In4  and then the pins entered
// here in the sequence 1-3-2-4 for proper sequencing of 28BYJ48
Stepper small_stepper(STEPS, motorPin1, motorPin3, motorPin2, motorPin4);

int  Steps2Take;

//The Button function you have to define by yourself
uint8_t getButton(){
  int adc_key_in = analogRead(0);
  if (adc_key_in > 790) return BUTTON_NONE;
  if (adc_key_in < 50) {
     return BUTTON_RIGHT;
  }
  if (adc_key_in < 195) {
     return BUTTON_UP;
  }
  if (adc_key_in < 380) {
     return BUTTON_DOWN;
  }
  if (adc_key_in < 555) {
     return BUTTON_LEFT; 
  }
  if (adc_key_in < 790) {
     return BUTTON_SELECT;  
  } 
  return BUTTON_NONE;
}
//////////////////////////////////////////////////////////////

void setup(){

 simpleui.write("beliebige Taste");
 simpleui.waitButton();

 simpleui.clear();
 delay(1000);
 
  pinMode(ledPin, OUTPUT);
   small_stepper.setSpeed(8);
 pinMode(sensorPin, INPUT);
 Serial.begin(9600);
}

void loop(){
 char buffer[20];
 uint16_t i;
 char* menu[] = {"Input Fotos","Input Schritte", "Input Zurueck", 0}; //last entry has to be 0
 switch(simpleui.showMenu("Stacker",menu)){
   case 0:
     i = simpleui.getUInt();
     simpleui.toString(i, buffer, 20);
     simpleui.write(buffer);
     Serial.println(buffer);
     simpleui.waitButton();
     break;
   case 1:     
    i = simpleui.getUInt();
     simpleui.toString(i, buffer, 20);
     simpleui.write(buffer);
     Serial.println(buffer);

     simpleui.waitButton();
     break;
   case 2:
     i = simpleui.getUInt();
     simpleui.toString(i, buffer, 20);
     simpleui.write(buffer);
     Serial.println(buffer);
     simpleui.waitButton();
     break;
 }
}

Dann hier das eigentliche Programm. Hierher sollen die Zahlenwerte aus dem Menu transferiert werden. Da die einzelnen Programmschritte immer separat gestartet werden sollen, wird es dann auch separate Taster auf A1 geben.

Das Programm läuft einwandfrei.


void shoot()

{ 
sensorValue = analogRead(sensorPin); 
 if (sensorValue <50)

{
 for (int x=0; x<30; x++) 
 {
 delay(500);  
 digitalWrite(ledPin, HIGH); //Kamera Auslösen
 delay(200);
 digitalWrite(ledPin, LOW); //Auslöseverzögerung SVA abwarten
 delay(500);
 
 small_stepper.setSpeed(8);  // max.14 
 Steps2Take  =  1;  // Rotate CW 1 step 0.49µm
 small_stepper.step(Steps2Take);
 delay(5); //Wartezeit für Blitzaufladung und Bildspeicherung
 
 }}
 
 else if (sensorValue <450)
 {
 for (int x=0; x<20; x++) {
 delay(500);  
 digitalWrite(ledPin, HIGH); //Kamera Auslösen
 delay(200);
 digitalWrite(ledPin, LOW); //Auslöseverzögerung SVA abwarten
 delay(500);
 
 small_stepper.setSpeed(8);  // max.14 
 Steps2Take  =  20;  // Rotate CW 1 step 0.49µm
 small_stepper.step(Steps2Take);
 delay(5); //Wartezeit für Blitzaufladung und Bildspeicherung
 
 }}
 else if (sensorValue <750)
{
 small_stepper.setSpeed(14);  // max14
 Steps2Take  =  5000;  // Rotate CCW
 small_stepper.step(Steps2Take);
 

}
else if (sensorValue <1000)
{
 small_stepper.setSpeed(14);  // max14
 Steps2Take  =  -20480;  // Rotate CCW
 small_stepper.step(Steps2Take);


}
}

Frage also:

Wie muss ich beide Teile verknüpfen, um im über das Menu die Parameter im Programm zu ändern?

Danke
Bernhard

Die Smilies im vorigen Post stammen nicht von mir, die hat der Upload gemacht :frowning:

bastler3:
Die Smilies im vorigen Post stammen nicht von mir, die hat der Upload gemacht :frowning:

Ja, weil Du die CODE-TAGS nicht verwendet hast.

Grüße Uwe

Verstehe ich das richtig: du kannst die gewünschten Wert bereits mit Simpleui einlesen?

Und die sollen jetzt auf Variablen im Programmbereich übertragen werden?

Ich kenne die SimplUI nicht, aber mir scheint, dass du im Menue mit z.B.
int i = simpleui.getUInt(); einen Wert ändern kannst.

Wenn du also z.B. deinem Programm in der Zeile
for (int x=0; x<30; x++)

Die Obergrenze "30" durch das Menue einstellen willst, dann brauchst du einen Menuepunkt zum Einstellen des Wertes, der die Zeile
Repeat1 = simpleui.getUInt();
enthält.

Und im Programm dann

for (int x=0; x<Repeat1 ; x++)

Meinst du sowas?

Hallo Guntherb,

Danke für Dein Feddback.

ja, es ist so, dass sowohl das Menu als auch das Stepperprogramm als unabhängige Sketches laufen.

In SimplUI kann ich Werte einstellen, die dorrt als "Buffer" wohl zwischengespeichert werden. Ausserdem kann ich diese Werte im Serialmonitor sehen.

Genau diese Werte sollen dann in das Stepperprogramm übertragen werden (Anzahl Fotos, Anzahl Schritte. Du hast das genau richtig verstanden.

Weitere Frage ist dann noch, ob ich da dann mit zwei Loops arbeiten kann (jeweils Menu und Schrittmotor).

Bernhard

Hallo Guntherb,

wo setze ich Repeat1 = simpleui.getUInt(); sinnvoller Weise ein?

Ich habe jetzt zuerst int Repeat1 in die Konfiguration gesetzt, dann die Zeile wie folgt eingefügt:

case 0:
      i = simpleui.getUInt();
      simpleui.toString(i, buffer, 20);
      simpleui.write(buffer);
      Serial.println(buffer);
      Repeat1 = simpleui.getUInt();
      simpleui.waitButton();
      break;

Die Überprüfung läuft durch ohne zu murren, das Menu nimmt aber die eingegebene Zahl bei drücken der Enter-tast nicht an.

Gruss
Bernhard

Du kannst nicht zwei loops laufen lassen.

Du kannst aber innerhalb der Loop Funktionen aufrufen.

Grob: Das, was du in der loop in deinem Menuesketch drinstehen hast, kopierst du in eine Funktion Menue().
Die Funktion Menue() rufst du in deinem Programm sketch als erstes auf.

Entsprechend mußt du die Befehle, die in den beiden Setup und vorher stehen, auch zusammenkopieren in einen Sketch.

Probier doch mal für den Anfang folgendes aus:
Nimm deinen Menue Beispielsketch.

Dort versuchst du, eine globale Variable zu ändern.
Überprüfen mit Serial.print() in der Loop().

Wie das genau geht, mit dieser SimpleUI, weiß ich nicht, und ich kann die auch nicht testen, weil ich alle meine LCD seriell ansteuere und damit läuft diese Lib nicht.

Hallo Guntherb,

Das

Probier doch mal für den Anfang folgendes aus:
Nimm deinen Menue Beispielsketch.
Dort versuchst du, eine globale Variable zu ändern.
Überprüfen mit Serial.print() in der Loop().

habe ich bereits zum ausprobieren des Menus gemacht, und gerade nochmals widerholt. Geht einwandfrei.

Sobald ich aber wie o.g. modifiziere, wird die Eingabe nicht mehr angenommen.

bastler3:
Hallo Guntherb,

Das

Probier doch mal für den Anfang folgendes aus:
Nimm deinen Menue Beispielsketch.
Dort versuchst du, eine globale Variable zu ändern.
Überprüfen mit Serial.print() in der Loop().

habe ich bereits zum ausprobieren des Menus gemacht, und gerade nochmals widerholt. Geht einwandfrei.

Das ist doch schon ein guter Anfang.

Laß' es mich verstehen:
du hast eine globale Variable, die du übers Menue verändern kannst?

Wenn ja dann mach' als nächstes eine Funktion:
deine loop() benennst du einfach um in Menue().
Dann schreibst du oben drüber eine neue loop(), in der du die Funktion Menue aufrufst.

Bisheriger Code:

void loop(){
 char buffer[20];
 uint16_t i;
.....

Neuer Code:

void loop(){
  Menue();
}
void Menue(){
 char buffer[20];
 uint16_t i;
.....

Wenn das geht, dann mußt du nur noch deine Funktion Menue() in den Sketch mit deinem Programm kopieren (inlusive der Befehle in und vor Setup()) und in der Loop als erstes Aufrufen.

Und du mußt sicher stellen, dass dein Programmteil (der mit den vielen delays) erst aufgerufen wird, wenn du alle deine Parameter gesetzt hast. (solange der Teil mit den Delays läuft, wird dein Display nicht bedient)

Mal ein Zwischenstand:

Die Anregungen, vor allem von Gunther, haben zwar nicht direkt geholfen. Indirekt aber schon, da ich jetzt einen Weg gefunden habe, die char-Werte in int zu konvertieren. Das ist jetzt mehr als die halbe Miete.

Das Menu sieht jetzt so aus und funktioniert:

#include <LiquidCrystal.h>
#include <SimpleUI16x2.h>

//CONFIGURATION/////////////////////////////////////////////
LiquidCrystal lcd(8,9,4,5,6,7);
SimpleUI16x2 simpleui(&lcd,getButton);

//The Button function you have to define by yourself
uint8_t getButton(){
	int adc_key_in = analogRead(0);
	if (adc_key_in > 790) return BUTTON_NONE;
	if (adc_key_in < 50) {
		return BUTTON_RIGHT;
	}
	if (adc_key_in < 195) {
		return BUTTON_UP;
	}
	if (adc_key_in < 350) {
		return BUTTON_DOWN;
	}
	if (adc_key_in < 555) {
		return BUTTON_LEFT; 
	}
	if (adc_key_in < 790) {
		return BUTTON_SELECT;  
	} 
	return BUTTON_NONE;
}

//////////////////////////////////////////////////////////////

void setup(){
  simpleui.write("Hello","World!");
  delay(1000);
  simpleui.write("Hold any button");
  simpleui.waitButton();
  simpleui.write("Release Button");
  simpleui.waitButtonRelease();
  simpleui.clear();
  delay(1000);
  Serial.begin(9600);
}

void loop(){
  char buffer[20];
  uint16_t i;
  char* menu[] = {"Input Fotos", "Input Schritte", 0}; //last entry has to be 0
  switch(simpleui.showMenu("titel",menu)){
    case 0:
     {
      i = simpleui.getUInt();
      simpleui.toString(i, buffer, 20);
      char *number_string = buffer;
      unsigned int Fotos = atoi (number_string);
      Serial.println(Fotos);
      simpleui.write(buffer);
      simpleui.waitButton();
    }
     
      break;
      
  case 1:
      {
      i = simpleui.getUInt();
      simpleui.toString(i, buffer, 20);
      char *number_string = buffer;
      unsigned int Schritte = atoi (number_string);
      Serial.println(Schritte);
      simpleui.write(buffer);
      simpleui.waitButton();
    }
     
      break;        
  }
}

Dank an alle Beteiligten. Die Einbindung des Programms werde ich jetzt hoffentlich auch schaffen.

Bernhard

bastler3:
Die Anregungen, vor allem von Gunther, haben zwar nicht direkt geholfen. Indirekt aber schon, da ich jetzt einen Weg gefunden habe, die char-Werte in int zu konvertieren.

Das mag an deiner präzisen Fehlerbeschreibung liegen, dass du dazu keine Hinweise bekommen hast.

guntherb:
Das mag an deiner präzisen Fehlerbeschreibung liegen, dass du dazu keine Hinweise bekommen hast.

Ich gehe davon aus, dass das leicht zynisch gemeint ist.

Mein letzter Post war aber durchaus positiv gemeint. Für eine besser Beschreibung hätte ich erst mal wissen müssen, dass die Werte als char vorliegen. Das habe ich erst später durch eine Fehlermeldung herausgefunden.

Entschuldigung, ich bin da wirklich Anfänger. Und ich werde es auch bleiben, da sicher nur gelegentlich eigene Projekte elektronisch steuern werde. Arduino-Programme als Selbstzweck sind für mich nicht wirklich attraktiv.

Bernhard

Genaugenommen liegen die Werte als C-Strings vor. Ein char ist ein vorzeichenbehaftetes Byte. In C sind Strings nicht mehr als Null-terminierte Arrays aus char. Also ein NULL, bzw. '\0' wird verwendet um das Ende des Strings zu markieren.

Das ist übrigens unnötig (schadet aber auch nichts):

char *number_string = buffer;

Arrays sind schon Zeiger auf das erste Element. buffer ist demnach schon ein char* (Zeiger auf char)

Wobei das ingesamt sehr seltsam ist:

      i = simpleui.getUInt();
      simpleui.toString(i, buffer, 20);
      char *number_string = buffer;
      unsigned int Schritte = atoi (number_string);

Du lässt dir einen Integer zurückgeben. Dann wandelst du ihn in einen C-String und danach wieder mit atoi() in ein Integer. Wozu?

Ich gebe ja zu, dass mir nicht immer ganz klar ist, was in so einem Programm abläuft, aber das

i = simpleui.getUInt();
simpleui.toString(i, buffer, 20);
char *number_string = buffer;

stammt nicht von mir, sondern ist Bestandteil eines Menüs aus dem Englischsprachigen Forum. Sei es wie es will, ich lasse das jetzt erstmal, da ich auf diesen Weg sicher bin, Integers zu erhalten und diese umbenennen zu können.

Ich stehe aber jetzt wieder da wie die Kuh vorm Berg.

Habe mal nach viel lesen und Vergleich mit anderen Programmen, versucht, den ersten Programmpunkt (shoot) in das Menu einzubinden. Funktioniert aber nicht:

  1. In void shoot() wird "Fotos" über Serial.println nicht angezeigt (wenn ich das an anderer Stelle anzeigen lasse, funktioniert das)

  2. void shoot() wird nicht gestartet (was evtl. damit zu tun haben kann, dass "Foto" hier leer ist).

Hinweis: zum starten von shoot und weiteren Funktionen wird eine zweite Tasterreihe an A1 verwendet.

Bitte um eure geschätzte Hilfe. Hier das bisherige Menu.

#include <Stepper.h>

#include <LiquidCrystal.h>
#include <SimpleUI16x2.h>

//CONFIGURATION/////////////////////////////////////////////
LiquidCrystal lcd(8,9,4,5,6,7);
SimpleUI16x2 simpleui(&lcd,getButton);

//Pins fuer Schrittmotor
int motorPin1 = 0;	// Blue   - 28BYJ48 pin 1
int motorPin2 = 1;	// Pink   - 28BYJ48 pin 2
int motorPin3 = 2;	// Yellow - 28BYJ48 pin 3
int motorPin4 = 3;	// Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)
int ledPin = 13; //Ausloeser fuer kamera

int sensorPin = A1;
int sensorValue = 0;
unsigned int x;
unsigned int Fotos;
#define STEPS  2048   //Number of steps per revolution

//The pin connections need to be 4 pins connected
// to Motor Driver In1, In2, In3, In4  and then the pins entered
// here in the sequence 1-3-2-4 for proper sequencing of 28BYJ48
Stepper small_stepper(STEPS, motorPin1, motorPin3, motorPin2, motorPin4);

int  Steps2Take;

//Drucktasten für Menuwahl und Zahleneingabe. Ggf anpassen.
uint8_t getButton(){
	int adc_key_in = analogRead(0);
	if (adc_key_in > 790) return BUTTON_NONE;
	if (adc_key_in < 50) {
		return BUTTON_RIGHT;
	}
	if (adc_key_in < 195) {
		return BUTTON_UP;
	}
	if (adc_key_in < 350) {
		return BUTTON_DOWN;
	}
	if (adc_key_in < 555) {
		return BUTTON_LEFT; 
	}
	if (adc_key_in < 790) {
		return BUTTON_SELECT;  
	} 
	return BUTTON_NONE;
}

//////////////////////////////////////////////////////////////

void setup(){
  simpleui.write("Hello","World!");
  delay(1000);
  simpleui.write("Hold any button");
  simpleui.waitButton();
  simpleui.write("Release Button");
  simpleui.waitButtonRelease();
  simpleui.clear();
  delay(1000);
  Serial.begin(9600);
}

void loop(){
  char buffer[20];
  uint16_t i;
  char* menu[] = {"Input Fotos", "Input Schritte", 0}; //last entry has to be 0
  switch(simpleui.showMenu("titel",menu)){
    case 0:
     {
      i = simpleui.getUInt();
      simpleui.toString(i, buffer, 20);
      //char in int konvertieren
      char *number_string = buffer;
      unsigned int Fotos = atoi (number_string);
    
      simpleui.write(buffer);
      simpleui.waitButton();
    }
     
      break;
                  
  }
  
  sensorValue = analogRead(sensorPin); 
  if (sensorValue <50)
  {
    shoot();
  }}

void shoot()
{
  for (unsigned int x=0; x<Fotos; x++)
    Serial.println(Fotos);
  {
  delay(500);  
  digitalWrite(ledPin, HIGH); //Kamera Auslösen
  delay(200);
  digitalWrite(ledPin, LOW); //Auslöseverzögerung SVA abwarten
  delay(500);
  
  small_stepper.setSpeed(8);  // max.14 
  Steps2Take  =  50;  // Rotate CW 1 step 0.49µm
  small_stepper.step(Steps2Take);
  delay(5); //Wartezeit für Blitzaufladung und Bildspeicherung
  
  }}

Danke für Eure Hinweise

Bernhard

Deine Klammersetzung ist falsch.

  for (unsigned int x=0; x<Fotos; x++)
    Serial.println(Fotos);
  {
  delay(500); 
  ...

Momentan wird in der for-Schleife nur das Serial.println(Fotos); ausgeführt.
(die erste Anweisung nach der for-Anweisung)
du musst die geschweifte Klammer vor Serial.println setzen.

zum Zweiten: wenn du mit Fotos = 0; in die Schleife gehst, wird diese nicht ausgeführt, weil die Schleifenbedingung x<Fotos nicht erfüllt wird. (ist ja auch logisch, mit Fotos = 0 soll ja auch kein Foto gemacht werden!)

zum Dritten: ich würde vor dem Aufruf von shoot() noch ein Serial.println(sensorvalue) einfügen, damit du siehst, ob die Funktion aufgerufen wird.

zum Vierten: du hast "Fotos", 2mal deklariert.
wenn du eine Variable innerhalb einer Switch-Case Struktur deklarierst, ist sie auch nur dort bekannt.
du hast in deinem Sketch als 2 Variablen namens "Fotos": einmal global, einmal in der Switch-Case anweisung. Die beiden haben nichts miteinander zu tun.

So könnte das funktionieren: (habs aber nicht getestet)

#include <Stepper.h>

#include <LiquidCrystal.h>
#include <SimpleUI16x2.h>

//CONFIGURATION/////////////////////////////////////////////
LiquidCrystal lcd(8,9,4,5,6,7);
SimpleUI16x2 simpleui(&lcd,getButton);

//Pins fuer Schrittmotor
int motorPin1 = 0;	// Blue   - 28BYJ48 pin 1
int motorPin2 = 1;	// Pink   - 28BYJ48 pin 2
int motorPin3 = 2;	// Yellow - 28BYJ48 pin 3
int motorPin4 = 3;	// Orange - 28BYJ48 pin 4
// Red    - 28BYJ48 pin 5 (VCC)
int ledPin = 13; //Ausloeser fuer kamera

int sensorPin = A1;
int sensorValue = 0;
unsigned int x;
unsigned int Fotos;
#define STEPS  2048   //Number of steps per revolution

//The pin connections need to be 4 pins connected
// to Motor Driver In1, In2, In3, In4  and then the pins entered
// here in the sequence 1-3-2-4 for proper sequencing of 28BYJ48
Stepper small_stepper(STEPS, motorPin1, motorPin3, motorPin2, motorPin4);

int  Steps2Take;

//Drucktasten für Menuwahl und Zahleneingabe. Ggf anpassen.
uint8_t getButton(){
  int adc_key_in = analogRead(0);
  if (adc_key_in > 790) return BUTTON_NONE;
  if (adc_key_in < 50) {
    return BUTTON_RIGHT;
  }
  if (adc_key_in < 195) {
    return BUTTON_UP;
  }
  if (adc_key_in < 350) {
    return BUTTON_DOWN;
  }
  if (adc_key_in < 555) {
    return BUTTON_LEFT; 
  }
  if (adc_key_in < 790) {
    return BUTTON_SELECT;  
  } 
  return BUTTON_NONE;
}

//////////////////////////////////////////////////////////////

void setup(){
  simpleui.write("Hello","World!");
  delay(1000);
  simpleui.write("Hold any button");
  simpleui.waitButton();
  simpleui.write("Release Button");
  simpleui.waitButtonRelease();
  simpleui.clear();
  delay(1000);
  Serial.begin(9600);
}

void loop(){
  char buffer[20];
  uint16_t i;
  char* menu[] = {
    "Input Fotos", "Input Schritte", 0  }; //last entry has to be 0
  switch(simpleui.showMenu("titel",menu)){
  case 0:
      i = simpleui.getUInt();
      simpleui.toString(i, buffer, 20);
      //char in int konvertieren
      char *number_string = buffer;
      Fotos = atoi (number_string);

      simpleui.write(buffer);
      simpleui.waitButton();    
    break;

  }// end switch

  sensorValue = analogRead(sensorPin); 
  Serial.print("sensorValue = ");Serial.println(sensorValue);
  if (sensorValue <50) {
    Serial.print("Aufruf shoot(). Fotos = ");Serial.println(Fotos);
    shoot();
  }
}// end loop()

void shoot(){
  for (unsigned int x=0; x<Fotos; x++){
    Serial.print(x);Serial.print(". Foto von ");  Serial.println(Fotos);
    delay(500);  
    digitalWrite(ledPin, HIGH); //Kamera Auslösen
    delay(200);
    digitalWrite(ledPin, LOW); //Auslöseverzögerung SVA abwarten
    delay(500);

    small_stepper.setSpeed(8);  // max.14 
    Steps2Take  =  50;  // Rotate CW 1 step 0.49µm
    small_stepper.step(Steps2Take);
    delay(5); //Wartezeit für Blitzaufladung und Bildspeicherung

  }// end for
}// end shoot()

Hallo Gunther,

das funktioniert leider auch nicht. Weder kann ich die Werte an A1 auslesen, noch wird der Wert für "Fotos" in der Funktion shoot angezeigt.

Zum ersteren: Die Tastatur an A1 funktioniert und ist richtig angeschlossen. Das habe ich mit dem Beispielsketch analog read auf der Arduino Homepage ausprobiert. Sobald ich aber zum Programmentwurf wechsle, kann ich Serial.println(sesorValue) hinschieben wo ich will, direkt hinter Serial.begin oder an den anfang von Loop, keine Anzeige.

Gruss
Bernhard