Initial import
[experiments/Hall_effect_rotary_encoder.git] / rotary_encoder / rotary_encoder.ino
1 /*
2  * Rotary encoder example
3  *
4  * Copyright (C) 2018  Antonio Ospite <ao2@ao2.it>
5  * SPDX-License-Identitier: WTFPL
6  */
7
8 #include <DFRkeypad.h>
9 #include <Encoder.h>
10 #include <LiquidCrystal.h>
11
12 #define ENCODER_CHANNEL_A 2
13 #define ENCODER_CHANNEL_B 3
14
15 #define COUNTS_PER_ROTATION 84
16
17 #define LCD_RS 8
18 #define LCD_EN 9
19 #define LCD_D4 4
20 #define LCD_D5 5
21 #define LCD_D6 6
22 #define LCD_D7 7
23 #define LCD_BL 10
24
25 #define BACKLIGHT_VALUE 1023
26
27 long old_counts = 0;
28 Encoder encoder(ENCODER_CHANNEL_A, ENCODER_CHANNEL_B);
29 LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
30
31 void setup() {
32         pinMode(LCD_BL, OUTPUT);
33         analogWrite(LCD_BL, BACKLIGHT_VALUE);
34
35         lcd.begin(16, 2);
36
37         lcd.setCursor(1, 0);
38         lcd.print("Rotary Encoder");
39         lcd.setCursor(1, 1);
40         lcd.print("https://ao2.it");
41
42         DFRkeypad::FastADC(true);
43         DFRkeypad::iDEFAULT_THRESHOLD=140;
44 }
45
46 void loop() {
47         byte key = DFRkeypad::GetKey();
48         if (key == DFRkeypad::eSELECT) {
49                 encoder.write(0);
50         }
51
52         long new_counts = encoder.read();
53         if (new_counts != old_counts) {
54                 old_counts = new_counts;
55
56                 lcd.clear();
57
58                 lcd.setCursor(0, 0);
59                 lcd.print("Count: ");
60                 lcd.setCursor(8, 0);
61                 lcd.print(new_counts);
62
63                 /* Position normalized between 0 and COUNTS_PER_ROTATION */
64                 long position = ((new_counts % COUNTS_PER_ROTATION) + COUNTS_PER_ROTATION) % COUNTS_PER_ROTATION;
65
66                 float angle = position * (360.0 / COUNTS_PER_ROTATION);
67
68                 lcd.setCursor(0, 1);
69                 lcd.print("Angle: ");
70                 lcd.setCursor(8, 1);
71                 lcd.print(angle);
72         }
73
74         delay(20);
75 }