Gemakkelijk Arduino menu's voor Rotary Encoders (2 / 3 stap)

Stap 2: Code


Dit is de code. Door te kijken naar de structuur en de opmerkingen ik hoop dat u vindt het gemakkelijk aan te passen aan uw specifieke behoeften!

 /*******Interrupt-based Rotary Encoder Menu Sketch******* * by Simon Merrett, based on insight from Oleg Mazurov, Nick Gammon, rt and Steve Spence, and code from Nick Gammon * 3,638 bytes with debugging on UNO, 1,604 bytes without debugging */ // Rotary encoder declarations static int pinA = 2; // Our first hardware interrupt pin is digital pin 2 static int pinB = 3; // Our second hardware interrupt pin is digital pin 3 volatile byte aFlag = 0; // let's us know when we're expecting a rising edge on pinA to signal that the encoder has arrived at a detent volatile byte bFlag = 0; // let's us know when we're expecting a rising edge on pinB to signal that the encoder has arrived at a detent (opposite direction to when aFlag is set) volatile byte encoderPos = 0; //this variable stores our current value of encoder position. Change to int or uin16_t instead of byte if you want to record a larger range than 0-255 volatile byte oldEncPos = 0; //stores the last encoder position value so we can compare to the current reading and see if it has changed (so we know when to print to the serial monitor) volatile byte reading = 0; //somewhere to store the direct values we read from our interrupt pins before checking to see if we have moved a whole detent // Button reading, including debounce without delay function declarations const byte buttonPin = 4; // this is the Arduino pin we are connecting the push button to byte oldButtonState = HIGH; // assume switch open because of pull-up resistor const unsigned long debounceTime = 10; // milliseconds unsigned long buttonPressTime; // when the switch last changed state boolean buttonPressed = 0; // a flag variable // Menu and submenu/setting declarations byte Mode = 0; // This is which menu mode we are in at any given time (top level or one of the submenus) const byte modeMax = 3; // This is the number of submenus/settings you want byte setting1 = 0; // a variable which holds the value we set byte setting2 = 0; // a variable which holds the value we set byte setting3 = 0; // a variable which holds the value we set /* Note: you may wish to change settingN etc to int, float or boolean to suit your application. Remember to change "void setAdmin(byte name,*BYTE* setting)" to match and probably add some "modeMax"-type overflow code in the "if(Mode == N && buttonPressed)" section*/ void setup() { //Rotary encoder section of setup pinMode(pinA, INPUT_PULLUP); // set pinA as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases) pinMode(pinB, INPUT_PULLUP); // set pinB as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases) attachInterrupt(0,PinA,RISING); // set an interrupt on PinA, looking for a rising edge signal and executing the "PinA" Interrupt Service Routine (below) attachInterrupt(1,PinB,RISING); // set an interrupt on PinB, looking for a rising edge signal and executing the "PinB" Interrupt Service Routine (below) // button section of setup pinMode (buttonPin, INPUT_PULLUP); // setup the button pin // DEBUGGING section of setup Serial.begin(9600); // DEBUGGING: opens serial port, sets data rate to 9600 bps } void loop() { rotaryMenu(); // carry out other loop code here } void rotaryMenu() { //This handles the bulk of the menu functions without needing to install/include/compile a menu library //DEBUGGING: Rotary encoder update display if turned if(oldEncPos != encoderPos) { // DEBUGGING Serial.println(encoderPos);// DEBUGGING. Sometimes the serial monitor may show a value just outside modeMax due to this function. The menu shouldn't be affected. oldEncPos = encoderPos;// DEBUGGING }// DEBUGGING // Button reading with non-delay() debounce - thank you Nick Gammon! byte buttonState = digitalRead (buttonPin); if (buttonState != oldButtonState){ if (millis () - buttonPressTime >= debounceTime){ // debounce buttonPressTime = millis (); // when we closed the switch oldButtonState = buttonState; // remember for next time if (buttonState == LOW){ Serial.println ("Button closed"); // DEBUGGING: print that button has been closed buttonPressed = 1; } else { Serial.println ("Button opened"); // DEBUGGING: print that button has been opened buttonPressed = 0; } } // end if debounce time up } // end of state change //Main menu section if (Mode == 0) { if (encoderPos > (modeMax+10)) encoderPos = modeMax; // check we haven't gone out of bounds below 0 and correct if we have else if (encoderPos > modeMax) encoderPos = 0; // check we haven't gone out of bounds above modeMax and correct if we have if (buttonPressed){ Mode = encoderPos; // set the Mode to the current value of input if button has been pressed Serial.print("Mode selected: "); //DEBUGGING: print which mode has been selected Serial.println(Mode); //DEBUGGING: print which mode has been selected buttonPressed = 0; // reset the button status so one press results in one action if (Mode == 1) { Serial.println("Mode 1"); //DEBUGGING: print which mode has been selected encoderPos = setting1; // start adjusting Vout from last set point } if (Mode == 2) { Serial.println("Mode 2"); //DEBUGGING: print which mode has been selected encoderPos = setting2; // start adjusting Imax from last set point } if (Mode == 3) { Serial.println("Mode 3"); //DEBUGGING: print which mode has been selected encoderPos = setting3; // start adjusting Vmin from last set point } } } if (Mode == 1 && buttonPressed) { setting1 = encoderPos; // record whatever value your encoder has been turned to, to setting 3 setAdmin(1,setting1); //code to do other things with setting1 here, perhaps update display } if (Mode == 2 && buttonPressed) { setting2 = encoderPos; // record whatever value your encoder has been turned to, to setting 2 setAdmin(2,setting2); //code to do other things with setting2 here, perhaps update display } if (Mode == 3 && buttonPressed){ setting3 = encoderPos; // record whatever value your encoder has been turned to, to setting 3 setAdmin(3,setting3); //code to do other things with setting3 here, perhaps update display } } // Carry out common activities each time a setting is changed void setAdmin(byte name, byte setting){ Serial.print("Setting "); //DEBUGGING Serial.print(name); //DEBUGGING Serial.print(" = "); //DEBUGGING Serial.println(setting);//DEBUGGING encoderPos = 0; // reorientate the menu index - optional as we have overflow check code elsewhere buttonPressed = 0; // reset the button status so one press results in one action Mode = 0; // go back to top level of menu, now that we've set values Serial.println("Main Menu"); //DEBUGGING } //Rotary encoder interrupt service routine for one encoder pin void PinA(){ cli(); //stop interrupts happening before we read pin values reading = PIND & 0xC; // read all eight pin values then strip away all but pinA and pinB's values if(reading == B00001100 && aFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin's rising edge encoderPos --; //decrement the encoder's position count bFlag = 0; //reset flags for the next turn aFlag = 0; //reset flags for the next turn } else if (reading == B00000100) bFlag = 1; //signal that we're expecting pinB to signal the transition to detent from free rotation sei(); //restart interrupts } //Rotary encoder interrupt service routine for the other encoder pin void PinB(){ cli(); //stop interrupts happening before we read pin values reading = PIND & 0xC; //read all eight pin values then strip away all but pinA and pinB's values if (reading == B00001100 && bFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin's rising edge encoderPos ++; //increment the encoder's position count bFlag = 0; //reset flags for the next turn aFlag = 0; //reset flags for the next turn } else if (reading == B00001000) aFlag = 1; //signal that we're expecting pinA to signal the transition to detent from free rotation sei(); //restart interrupts } // end of sketch! 

Ik heb "DEBUGGING" gebruikt aan het begin van elke commentaar op alle lijnen die niet essentieel is voor het menu om zijn ding te doen. Als u tevreden met de menu's functie bent, wilt u misschien commentaar uit of verwijder deze regels voor kleinere gecompileerde schets grootte.

Wees ervan bewust dat een essentieel onderdeel van de menunavigatie feedback aan de gebruiker terwijl ze zijn scrollen door de optie en de instellingen. Daarom kiest u niet op te nemen van de lijnen van de foutopsporing, moet u waarschijnlijk een andere visuele indicator (bijvoorbeeld LCD tekstweergave, LEDs) dat encoder ingangen zijn navigeren door het menu instellingen en wijzigen gebruiken.

Als ik commentaar uit de lijnen van de foutopsporing (vaststellend dat sommige visuele feedback nog nodig zou zijn voor menunavigatie) is de gecompileerde code ongeveer 1.650 bytes voor de Arduino Uno, hopelijk voldoende ruimte te verlaten op uw ATMEGA328P voor de meer spannende onderdelen voor uw schets!

Ga naar stap 3 om erachter te komen hoe het menusysteem werkt.

Gerelateerde Artikelen

Ontwerp een aangepaste Menu systeem--Android/Arduino-menu's voor Beginners--absoluut geen programmering vereist

Ontwerp een aangepaste Menu systeem--Android/Arduino-menu's voor Beginners--absoluut geen programmering vereist

IntroductieDit instructable ziet u hoe u de gratis pfodDesigner beschikbaar op GooglePlay ontwerpen van een menusysteem van de Android met submenu's voor Arduino-compatibele apparaten.De tutorial is geschikt voor complete beginners. Geen codering erv
Gemakkelijk Arduino drukknop scoren voor twee Teams

Gemakkelijk Arduino drukknop scoren voor twee Teams

Hier is een eenvoudige drukknop setup voor twee teams scoren. Het heeft een up en een benedenknoop voor elk team en een resetknop om de scores terug naar 0. De scores worden in de seriële Monitor weergegeven. Ik ben zeker met minimale wijzigingen die
De generator van de code voor aangepaste Android/Arduino-menu's aan de Arduino uitgangen wissel voort en vandoor. Andriod/Arduino voor Beginners. Absoluut geen programmeerkennis vereist

De generator van de code voor aangepaste Android/Arduino-menu's aan de Arduino uitgangen wissel voort en vandoor. Andriod/Arduino voor Beginners. Absoluut geen programmeerkennis vereist

Update: een gebruiker gevraagd voor submenu ondersteuning. pfodApp altijd ondersteund submenu's maar ik sub-menu's hebt toegevoegd aan pfodDesigner. De instructable stelsel van het Gemeenschapsmodel A Custom Menu ziet u hoe u pfodDesigner wilt samens
Arduino aangedreven Rotary Encoders - ik maakte het op TechShop

Arduino aangedreven Rotary Encoders - ik maakte het op TechShop

zoals in sommige van mijn verleden instructables, arduino gaat allemaal over controle. De mogelijkheid om bepaalde dingen zoals displays, servo's, motoren, en andere elektrische mechanische apparaten op een zinvolle manier. Ik heb onder met behulp va
Gemakkelijk boren staan voor Rotary Tool

Gemakkelijk boren staan voor Rotary Tool

ik de stand van een boor nodig voor Rotary Tool. Ik vond niet ieder bruikbaar voor mijn Rotary Tool dus ik besluit te halen mijn eigen.Stap 1: Alles wat u nodig hebt is:-stuk multiplex,-2 korte lade Slide-1 pijp houder-stuk van gom-Sommige schroeven-
Vernier sensoren en Arduino (of Teensy) voor het registreren van gegevens

Vernier sensoren en Arduino (of Teensy) voor het registreren van gegevens

laten we eens kijken hoe gegevens verzamelen van Vernier educatieve sensoren met behulp van een Arduino-compatibele board voor de ontwikkeling van de microcontroller.Als u slechts wilt interface een sonde met een computer en wil alles om te werken, m
Arduino Push waarschuwingen voor deurbel, inbraakalarm, roken alarmen enz

Arduino Push waarschuwingen voor deurbel, inbraakalarm, roken alarmen enz

IoT kennisgevingen van uw deurbel, inbraakalarm, roken alarmen enz met behulp van een Arduino Uno en een Ethernet-Shield.Volledige details op mijn website hierOver Arduino Push waarschuwingsvensterMaakt gebruik van een Arduino Uno en de Ethernet-Shie
Arduino Timing circuit voor productielijn

Arduino Timing circuit voor productielijn

Waar ik werk hebben wij halfautomatische machines en een target uitvoeren snelheid.Dus ik hoe kan ik het opbouwen van een timing apparaat dacht zodat de operator een consistente snelheid houden kan van het runnen van de machine zoals ze ook de belang
Snel en gemakkelijk Arduino compatibel H-brug Shield

Snel en gemakkelijk Arduino compatibel H-brug Shield

In dit instructable ik zal in detail te beschrijven hoe ik ging over het maken van een snel en gemakkelijk, Arduino compatibel, H-brug schild. Maar eerst, een korte intro in wat kreeg me gemotiveerd om het te maken.Een paar jaar geleden, begon ik mee
Arduino Due gebruiken voor het programmeren en testen ESP8266

Arduino Due gebruiken voor het programmeren en testen ESP8266

Als u wenst te programmeren een ESP8266 (Wifi SoC) zult u normaal gebruik maken van een USB naar seriële adapter zoals deze. In het geval u geen één hebt maar u hebt kan een Arduino Due tot rond je de Arduino tuig als een brug te programmeren en test
Arduino PID code voor lijn volgende Robot

Arduino PID code voor lijn volgende Robot

In dit instructable, leert u hoe maak je Arduino PID codes voor elke taak, sommige wiskunde en ontwerp robots die efficiënter dan anderen zijn.Om te beginnen, Bekijk de video hierboven om te zien hoe de PID lijn volgende werkt, in dit voorbeeld gebru
Gemakkelijk, omkeerbare Motor controle voor Arduino (of een Microcontroller)

Gemakkelijk, omkeerbare Motor controle voor Arduino (of een Microcontroller)

dit project maakt gebruik van slechts drie hoofdcomponenten voor voorwaartse en omgekeerde bepalen voor een interne motor.  U kunt het gemakkelijk interface naar een Arduino of elke andere microcontroller.Het is zo eenvoudig - u kunt het draad van "f
Interactief ontwerp en codegeneratie van aangepaste Android menu's voor Arduino--geen Android programmeren vereist

Interactief ontwerp en codegeneratie van aangepaste Android menu's voor Arduino--geen Android programmeren vereist

UpDate: Check out de nieuwere InstructableAndriod/Arduino voor Beginners - ontwerp Custom Andriod menu's aan de Arduino uitgangen wissel voort en vandoor. Absoluut geen programmeerkennis vereistdat alle code van de Arduino voor u met behulp van de ni
Hacken van een Arduino ISP schild voor AtTiny45 / AtTiny85

Hacken van een Arduino ISP schild voor AtTiny45 / AtTiny85

Dit is hoe hack een Evil Mad wetenschappers Lab Arduino ISP Shield zodat u de Arduino omgeving gebruiken kunt sommige handige kleine microcontrollers te programmeren.De Arduino is een grote kleine ontwikkelomgeving voor het maken van de elektronische