25. September 2012
Mit Hilfe von zwei Tastern lässt sich ein Wert erhöhen, bzw. verringern. Der aktuelle Wert wird auf einer LED-Bar dargestellt. Durch Drücken eines Buttons gelangt man in den Bearbeitungsmodus der durch Blinken des aktuellen Werts auf der LED-Bar dargestellt wird. Nach ein paar Sekunden der Inaktivität beendet sich der Bearbeitungsmodus und der neue Wert wird gesetzt. How it works (Video)
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int ledBar9 = 6;
int ledBar10 = 7;
int pinBtL = 3;
int pinBtR = 2;
int count = 9;
long currentMillis = 0;
long previousMillis = 0;
int interval = 250;
int barValue = 3;
boolean writeMode = false;
long previousWriteMode = 0;
boolean blinkStat = false;
long previousBlinkMil = 0;
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(ledBar9, OUTPUT);
pinMode(ledBar10, OUTPUT);
previousBlinkMil = millis();
previousWriteMode = millis();
}
void loop() {
currentMillis = millis();
//Serial.println(writeMode);
if (previousWriteMode+5000 - currentMillis < 0) {
writeMode = false;
}
if (writeMode) {
if(currentMillis - previousBlinkMil > 280) {
previousBlinkMil = currentMillis;
if (blinkStat) {
blinkStat = false;
} else {
//Serial.println("Blink!");
registerWrite(0);
blinkStat = true;
}
}
} else {
blinkStat = false;
}
int buttonLeft = digitalRead(pinBtL);
int buttonRight = digitalRead(pinBtR);
if (!buttonLeft) {
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
Serial.println("Press Left");
if (writeMode) {
previousWriteMode = currentMillis;
if (barValue > 0)
barValue--;
} else {
previousWriteMode = currentMillis;
writeMode = true;
}
}
}
if (!buttonRight) {
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
Serial.println("Press Right");
if (writeMode) {
previousWriteMode = currentMillis;
if (barValue < 11)
barValue++;
} else {
previousWriteMode = currentMillis;
writeMode = true;
}
}
}
if (!blinkStat)
registerWrite(barValue);
}
void registerWrite(int _segements) {
int offset = 0;
byte bitsToSend = 0; // Dieses Byte hat acht Bits also: 00000000
digitalWrite(latchPin, LOW);
if (_segements > 0) {
digitalWrite(ledBar10, HIGH);
offset++;
} else {
digitalWrite(ledBar10, LOW);
}
if (_segements > 1) {
digitalWrite(ledBar9, HIGH);
offset++;
} else {
digitalWrite(ledBar9, LOW);
}
for (int i = _segements-offset; i > 0; i--) {
bitWrite(bitsToSend, 8 - i, HIGH);
}
shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
digitalWrite(latchPin, HIGH);
}
void barWrite(int _segments) {
}