Hur man lagrar en momentan knapptryckning som ett menyval (2 / 4 steg)
Steg 2: Koden
Koden:
#include < EEPROMex.h >
#define NUMSELECTIONS 4
globala variabler
unsigned int addressButton1StateBits;
int currentSelection;
booleska button1Pressed = 0;
booleska previousButton1Pressed = 0;
osignerade långa debounceCount;
osignerade långa blinkMillis;
unsigned int blinkInterval;
void setup() {
Serial.BEGIN(57600);
initiera EEPROM inställningar
EEPROM.setMaxAllowedWrites(400);
EEPROM.setMemPool (256, EEPROMSizeATmega328);
addressButton1StateBits = EEPROM.getAddress(4);
currentSelection = readEESelection();
Serial.Print ("\nRestored markering");
Serial.println(currentSelection);
pinMode (12, INPUT_PULLUP).
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pinMode (13, OUTPUT);
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (13, 1);
slå på lampan för återställda markeringen
digitalWrite (currentSelection + 2, 0);
} / / slutet av installationen
void loop() {
läsa på knappen inte oftare än en gång varje 20 ms, debouncing
om (millis() > 20 & & debounceCount < millis() - 20) {
debounceCount = millis();
button1Pressed =! digitalRead(12);
}
Om knappen har tryckts, öka och lagra urval
om (previousButton1Pressed! = button1Pressed) {
previousButton1Pressed = button1Pressed;
endast vidta åtgärder när knappen trycks, inte när släppt
om (button1Pressed) {
stänga av lampan för gamla val
digitalWrite (currentSelection + 2, 1);
currentSelection ++;
currentSelection % = NUMSELECTIONS;
slå på lampan för nya val
digitalWrite (currentSelection + 2, 0);
Serial.Print ("aktuell markering");
Serial.println(currentSelection);
updateEESelection();
}
}
Här är i slingan där vi kan göra olika saker beroende på
Vad valet gjordes med knappen.
I detta fall blinka vi Arduino ombord LED med olika intervaller
beroende på valet.
Detta visar också huvudloop bearbetning utan dröjsmål blockering.
om (currentSelection == 0) {
Dim LED av blinkar det snabbt, bit-banka PWM
om (digitalRead(13)) {
blinkInterval = 0;
}
annat {
blinkInterval = 10;
}
}
annat if (currentSelection == 1) {
Blinkar en gång per sekund
blinkInterval = 500.
}
annat if (currentSelection == 2) {
Blinka var 2 sekunder
blinkInterval = 1000;
}
annat if (currentSelection == 3) {
Snabb blixt var 1,5 sekunder, detta också lite-banka PWM, mycket långsam
om (digitalRead(13)) {
blinkInterval = 50;
}
annat {
blinkInterval = 1450;
}
}
om (millis() > blinkInterval & & blinkMillis < millis() - blinkInterval) {
blinkMillis = millis();
digitalWrite (13,! digitalRead(13));
}
} / / end av loop
byte readEESelection() {
räkna igenom bitarna av lagring tills vi hittar en bit med värdet 1
byte i.
för (jag = 0; jag < 32; i ++) {
byte byteNum, bitNum;
byteNum = jag / 8;
bitNum = jag % 8.
booleska bitValue = EEPROM.readBit (addressButton1StateBits + byteNum, bitNum);
om (bitValue) {
bryta;
}
}
returnera modulusen av bitars nummer, som är val av nummer
tillbaka i % NUMSELECTIONS;
}
void updateEESelection() {
medan (readEESelection()! = currentSelection) {
räkna igenom bitarna av lagring tills vi hittar en bit med värdet 1
och som lite 0
byte i, byteNum, bitNum;
för (jag = 0; jag < 32; i ++) {
byteNum = jag / 8;
bitNum = jag % 8.
om (EEPROM.readBit (addressButton1StateBits + byteNum, bitNum) == 1) {
EEPROM.updateBit (addressButton1StateBits + byteNum, bitNum, 0);
bryta;
}
om vi inte hittar en bit med värdet 1, som alla 1 startar sökningen över
om (jag == 31) {/ / lite att rensa hittades inte innan sista biten
för (jag = 0; jag < 4; i ++) {
EEPROM.updateByte (addressButton1StateBits + i, 0xFF);
}
}
}
} / / medan loopen upprepas tills bitarna anges så att de matchar nummer
}