Hallo in die Runde,
bin neu hier und bastele auch erst seit wenigen Tagen mit einem UNO herum. Hintergrund meines Anliegens ist, dass einem kleinen Hundeverein in unserer Stadt die Zeitnahme mittels einer älteren Stoppuhr abgeraucht ist und etwas Neues an die Lichtschranken soll. Da sich das Budget des Vereins sehr in Grenzen hält, kommt eine komplette Neuanschaffung nicht in Frage. Ersatzteile für die alte Uhr gibt es leider nicht mehr.
Nun soll schon am kommenden Sonntag eine Zeitmessung verfügbar sein. Für mich als Anfänger in Sachen Arduino ist das in 3 Tagen nicht zu leisten, auch wenn ich mich jetzt Tag und Nacht hinsetze um zu lernen. Deshalb bitte ich hier um eure Hife.
Nun zur Aufgabe:
Ich habe einen UNO mit LCD Keypad gekauft und einen vorhandenen Sketch in setup() und loop() etwas umgebaut. Die benötigten Stellen zählen nun auf dem Display hoch, wie gewünscht.
Was mir jedoch noch fehlt, ist die Anschaltung der beiden Lichtschranken für START und STOP sowie ein TASTER für RESET und das Halten des Nullzustandes, bis LS schaltet.
Die LS laufen empfängerseitig mit 5V, sollten also ggf. direkt anschaltbar sein.
http://www.produktinfo.conrad.com/datenblaetter/125000-149999/130242-an-01-ml-Zusatzlichtschranke_fuer_130202.pdf (Schaltplan siehe Seite 4).
Hier ist der bisherige Code:
/*
Simple stopwatch code for the SainSmart LCD & Keypad Shield
This example code is in the public domain
---------------------------------------------------------------------
Pins used by LCD & Keypad Shield:
A0: Buttons, analog input from voltage ladder
D4: LCD bit 4
D5: LCD bit 5
D6: LCD bit 6
D7: LCD bit 7
D8: LCD RS
D9: LCD E
D3: LCD Backlight (high = on, also has pullup high so default is on)
ADC voltages for the 5 buttons on analog input pin A0:
RIGHT: 0.00V : 0 @ 8bit ; 0 @ 10 bit
UP: 0.71V : 36 @ 8bit ; 145 @ 10 bit
DOWN: 1.61V : 82 @ 8bit ; 329 @ 10 bit
LEFT: 2.47V : 126 @ 8bit ; 505 @ 10 bit
SELECT: 3.62V : 185 @ 8bit ; 741 @ 10 bit
*/
/*--------------------------------------------------------------------------------------
Includes
--------------------------------------------------------------------------------------*/
#include <Wire.h>
#include <LiquidCrystal.h> // include LCD library
/*--------------------------------------------------------------------------------------
Defines
--------------------------------------------------------------------------------------*/
// Pins in use
#define BUTTON_ADC_PIN A0 // A0 is the button ADC input
#define LCD_BACKLIGHT_PIN 3 // D3 controls LCD backlight
// ADC readings expected for the 5 buttons on the ADC input
#define RIGHT_10BIT_ADC 0 // right
#define UP_10BIT_ADC 145 // up
#define DOWN_10BIT_ADC 329 // down
#define LEFT_10BIT_ADC 505 // left
#define SELECT_10BIT_ADC 741 // right
#define BUTTONHYSTERESIS 10 // hysteresis for valid button sensing window
//return values for ReadButtons()
#define BUTTON_NONE 0 //
#define BUTTON_RIGHT 1 //
#define BUTTON_UP 2 //
#define BUTTON_DOWN 3 //
#define BUTTON_LEFT 4 //
#define BUTTON_SELECT 5 //
//some example macros with friendly labels for LCD backlight/pin control, tested and can be swapped into the example code as you like
#define LCD_BACKLIGHT_OFF() digitalWrite( LCD_BACKLIGHT_PIN, LOW )
#define LCD_BACKLIGHT_ON() digitalWrite( LCD_BACKLIGHT_PIN, HIGH )
#define LCD_BACKLIGHT(state) { if( state ){digitalWrite( LCD_BACKLIGHT_PIN, HIGH );}else{digitalWrite( LCD_BACKLIGHT_PIN, LOW );} }
/*--------------------------------------------------------------------------------------
Variables
--------------------------------------------------------------------------------------*/
byte buttonJustPressed = false; //this will be true after a ReadButtons() call if triggered
byte buttonJustReleased = false; //this will be true after a ReadButtons() call if triggered
byte buttonWas = BUTTON_NONE; //used by ReadButtons() for detection of button events
int hsekunden = 0;
int sekunden = 0;
int minuten = 0;
/*--------------------------------------------------------------------------------------
Init the LCD library with the LCD pins to be used
--------------------------------------------------------------------------------------*/
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 ); //Pins for the freetronics 16x2 LCD shield. LCD: ( RS, E, LCD-D4, LCD-D5, LCD-D6, LCD-D7 )
/*--------------------------------------------------------------------------------------
setup()
Called by the Arduino framework once, before the main loop begins
--------------------------------------------------------------------------------------*/
void setup()
{
//button adc input
pinMode( BUTTON_ADC_PIN, INPUT ); //ensure A0 is an input
digitalWrite( BUTTON_ADC_PIN, LOW ); //ensure pullup is off on A0
//lcd backlight control
digitalWrite( LCD_BACKLIGHT_PIN, HIGH ); //backlight control pin D3 is high (on)
pinMode( LCD_BACKLIGHT_PIN, OUTPUT ); //D3 is an output
//set up the LCD number of columns and rows:
lcd.begin( 16, 2 );
//Print some initial text to the LCD.
lcd.setCursor( 0, 0 ); //top left
// 1234567890123456
lcd.print( "Hunderennen 2014" );
//
lcd.setCursor( 0, 1 ); //bottom left
// 1234567890123456
lcd.print( "Zeit:" );
}
/*--------------------------------------------------------------------------------------
loop()
Arduino main loop
--------------------------------------------------------------------------------------*/
void loop()
{
hsekunden = ( (millis() / 1) % 60 );
// setzt doppelpunkte vor hsekunden
lcd.setCursor( 13, 1 );
lcd.print( ":" );
// schreibt den wert der hundertstel mit 2 stellen
lcd.setCursor( 14, 2 );
if( hsekunden <= 9 )
lcd.print( "0" );
lcd.print( hsekunden, DEC );
sekunden = ( (millis() / 1000) % 60 );
// setzt doppelpunkte vor sekunden
lcd.setCursor( 10, 1 );
lcd.print( ":" );
// schreibt den wert der sekunden mit 2 stellen
lcd.setCursor( 11, 1 );
if( sekunden <= 9 )
lcd.print( "0" );
lcd.print( sekunden, DEC );
minuten = ( (millis() / 100000) % 60 );
// schreibt den wert der minuten mit 2 stellen
lcd.setCursor( 8, 1 );
if( minuten <= 9 )
lcd.print( "0" );
lcd.print( minuten, DEC );
}