Arduino facile des Menus pour les encodeurs rotatifs (2 / 3 étapes)

Étape 2: Code

C’est le code. En examinant la structure et les commentaires, j’espère que vous trouverez qu’il est facile de s’adapter à vos besoins spécifiques !

 /*******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! 

J’ai utilisé « Débogage » au début de chaque commentaire sur n’importe quelle ligne qui n’est pas critique pour le menu à faire sa chose. Si vous êtes satisfait de la fonction du menu, vous pouvez commenter ou supprimer ces lignes de taille plus petite compilé esquisse.

Sachez qu’un élément clé du menu de navigation est rétroaction à l’utilisateur alors qu’ils sont le défilement par le biais de l’option et les paramètres. Par conséquent, si vous choisissez de ne pas inclure les lignes de débogage, vous devriez probablement utiliser un autre indicateur visuel (par exemple l’affichage de texte de LCD, LED) que les entrées d’encodeurs sont navigation dans le menu et modifier les paramètres.

Si je commente les lignes de débogage (à noter qu’une rétroaction visuelle serait encore nécessaire pour la navigation) le code compilé est environ 1 650 octets pour l’Arduino Uno, j’espère que laissant beaucoup de place sur votre ATMEGA328P pour les parties plus excitants de votre dessin !

Passez à l’étape 3 pour savoir comment fonctionne le système de menu.

Articles Liés

Faire des boucles pour les cheveux ruban

Faire des boucles pour les cheveux ruban

fabrication de boucles pour les cheveux ruban de http://www.diyhairbows.com Faire des boucles ruban pour les cheveux, c'est facile et amusant. En faisant des boucles pour les cheveux ruban vous avez une variété de couleurs et de matériaux à votre dis
Facile artisanat amusant pour les enfants : bricolage papier Crocodile tutoriel

Facile artisanat amusant pour les enfants : bricolage papier Crocodile tutoriel

Kids ! Ajouter cette féroce mais joli Papier Crocodile à votre collection d'animaux de papier. Ce métier de plaisir facile pour les enfants est une étonnante DIY facile artisanat idée que tous les enfants aimeraient faire. Ce fantastique bricolage pa
Remèdes maison pour les problèmes médicaux courants.

Remèdes maison pour les problèmes médicaux courants.

Que nous avons tous souffrent de commune des problèmes médicaux comme les maux de tête, mal des transports, froid, douleurs etc.. Ici dans ce instructable je vais vous dire quelques remèdes à la maison plus efficaces. Pour quelques causes communes.No
Arduino ligne Robot suivants pour les débutants

Arduino ligne Robot suivants pour les débutants

* mise à jour GREEN 8 / 2 4 / 2 GREEN 1 voidsetup() {   // a variable created in here doesn't exist in loop } voidloop() {   // a variable created in here doesn't exist in setup } pour inclure plus de prix, source informations et modèles haut/bas/rou
Comment faire des baguettes pour les enfants - 6 dessins

Comment faire des baguettes pour les enfants - 6 dessins

(Regardez la vidéo)Baguettes peuvent être difficiles pour tout le monde, surtout pour les enfants.Voici donc les 6 astuces pour faire des baguettes pour les enfants.
Concevoir un Custom Menu System--Android/Arduino de menus pour les débutants--absolument aucune programmation requise

Concevoir un Custom Menu System--Android/Arduino de menus pour les débutants--absolument aucune programmation requise

IntroductionCette instructable montre comment utiliser la libre pfodDesigner disponible sur GooglePlay pour concevoir un système de menus Android avec des sous-menus pour périphériques compatibles Arduino.Le tutoriel est adapté aux débutants. Aucune
Contrôleur de timelapse très facile et simple pour les reflex numériques eos de canon avec arduino

Contrôleur de timelapse très facile et simple pour les reflex numériques eos de canon avec arduino

vous avez besoin :Arduino (j'utilise freetronics leostick)Relais de 3Vune prise télécommande pour votre appareil photoun pack de batterie AA 4 xinterrupteurs/boutons (facultatif)commutateur à 3 positions pour la version 2Étape 1: Connectez la batteri
Arduino « Cligner des yeux pour parler » à l’aide de Charlieplexing

Arduino « Cligner des yeux pour parler » à l’aide de Charlieplexing

Ce projet peut être classifié comme périphérique d'AAC (Communication améliorée et Alternative), qui sont utilisés comme un moyen de communication pour ceux qui souffrent de maladies comme ALS débilitantes, qui provoquer une paralysie complète et per
Yogy - l’Arduino alimenté Robot fait pour les enfants

Yogy - l’Arduino alimenté Robot fait pour les enfants

dans ce Instructable je vais vous montrer comment faire un mignon et kid friendly Robot Obstacle évitant, j'aime appeler Yogy.Yogy obtient son nom du corps de baignoire d'yaourt qu'il est issu. Je suis une ventouse pour voir le meilleur dans la corbe
Carte des lits pour les sans-abri

Carte des lits pour les sans-abri

J'ai conçu ce lit afin que les personnes sans abri peuvent avoir sommeil une plus confortable nuit de. Comme il leur soulève du sol et est constituée d'un matériau qui n'est pas conduite de chaleur ou froid et qui est solide, il fait une grande diffé
Comment faire des tiroirs pour les armoires

Comment faire des tiroirs pour les armoires

Il arrive un moment dans n'importe quel passe-temps de menuisiers à où ils sont confrontés à la fabrication des tiroirs. J'entends souvent des gens ayant des problèmes avec tout à en sortir comme prévu. J'ai voulu montrer un procédé de fabrication de
Comment faire des boucles pour les cheveux

Comment faire des boucles pour les cheveux

dans ce instructable je vais vous montrer comment faire cinq arcs de cheveux différents. Ils sont assez faciles à faire et à l'air assez sympa. Il s'agit de mon entrée dans le 4ème tour des Questions brûlantes. Avoir du plaisir à faire ces boucles po
Catipiller mignon des collations pour les enfants !

Catipiller mignon des collations pour les enfants !

il s'agit d'une collation saine, facile et amusante pour tous les âgesprendre environ 30 grands scewers et ajouter autant de raisins verts ou rouges que vous pouvez ou faire un modèle.pour les visages utiliser la crème au beurre blanc glaçage dans un
Une TV facile à utiliser à distance pour les personnes âgées.

Une TV facile à utiliser à distance pour les personnes âgées.

Personnes âgées peinent parfois à l'aide d'une télécommande de TV. Télécommandes de TV typiques disposent d'une tonne de petits boutons, tous jetés avec peu de rimes et de raison. (On peut demander ce que leurs concepteurs pensaient:-) Il est donc di