1 | #include <Adafruit_NeoPixel.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | #define NUMPIXELSA 5
|
6 | #define NUMPIXELSB 5
|
7 | #define NUMPIXELSC 5
|
8 |
|
9 | Adafruit_NeoPixel strip_A = Adafruit_NeoPixel(NUMPIXELSA, 0, NEO_GRB + NEO_KHZ800); // 3 Strips designed to be offset by 120 degrees on a wheel
|
10 | Adafruit_NeoPixel strip_B = Adafruit_NeoPixel(NUMPIXELSB, 1, NEO_GRB + NEO_KHZ800);
|
11 | Adafruit_NeoPixel strip_C = Adafruit_NeoPixel(NUMPIXELSC, 3, NEO_GRB + NEO_KHZ800);
|
12 |
|
13 | //uint32_t whiteA = strip_A.Color(255, 255, 255); disabled for testing purposes
|
14 | //uint32_t whiteB = strip_B.Color(255, 255, 255);
|
15 | //uint32_t whiteC = strip_C.Color(255, 255, 255);
|
16 |
|
17 | uint32_t offA = strip_A.Color(0, 0, 0);
|
18 | uint32_t offB = strip_B.Color(0, 0, 0);
|
19 | uint32_t offC = strip_C.Color(0, 0, 0);
|
20 |
|
21 | uint32_t whiteA = strip_A.Color(0, 0, 255); //Testcolor to better see it in the simulator ;)
|
22 | uint32_t whiteB = strip_B.Color(0, 0, 255);
|
23 | uint32_t whiteC = strip_C.Color(0, 0, 255);
|
24 |
|
25 | volatile unsigned long time = 0;
|
26 | volatile unsigned long time_last = 0;
|
27 | volatile unsigned int rpm_array[3] = {0, 0, 0}; // 3 samples averaged
|
28 | unsigned long refreshInterval = 10; // in ms, for LCD refresh timing
|
29 | unsigned long previousMillis = 0;
|
30 | volatile unsigned int rpm = 0;
|
31 | volatile unsigned int last_rpm = 0;
|
32 | unsigned int rotDelay = 0; // Calculated time based variable to control the duration and delay between LEDs switching on and off, integer instead of float to test and save processing time
|
33 | unsigned int rotDelayA = 0;
|
34 | void setup()
|
35 | {
|
36 | GIMSK = 0b01000000; // Enable INT0 External Interrupt
|
37 | MCUCR = 0b00000011; // Rising-Edge Triggered INT0
|
38 |
|
39 | DDRB &= ~(1<<PB5); //Set unused pins as input.
|
40 | DDRB &= ~(1<<PB4);
|
41 | PORTB |= (1 << PB5); // Enable pullup resistor
|
42 | PORTB |= (1 << PB4);
|
43 |
|
44 | strip_A.begin(); // Initialize Neopixel Strips
|
45 | strip_B.begin();
|
46 | strip_C.begin();
|
47 | strip_A.setBrightness(230); // Set Strips to approx 90% Brightness
|
48 | strip_B.setBrightness(230);
|
49 | strip_C.setBrightness(230);
|
50 | strip_A.show(); // Send empty data to strips to reset floating output turning all Neopixels off
|
51 | strip_B.show();
|
52 | strip_C.show();
|
53 |
|
54 | // for (int a = 0; a < NUMPIXELSA; a++) { // Strip Test
|
55 | // strip_A.setPixelColor(a, whiteA );
|
56 | // strip_A.show(); // Send data
|
57 | // delay(100); // Delay to test each strip
|
58 | // }
|
59 | // for (int a = 0; a < NUMPIXELSA; a++) {
|
60 | // strip_A.setPixelColor(a, offA );
|
61 | // strip_A.show();
|
62 | // }
|
63 | // for (int b = 0; b < NUMPIXELSB; b++) {
|
64 | // strip_B.setPixelColor(b, whiteB);
|
65 | // strip_B.show();
|
66 | // delay(100);
|
67 | // }
|
68 | // for (int b = 0; b < NUMPIXELSA; b++) {
|
69 | // strip_B.setPixelColor(b, offB );
|
70 | // strip_B.show();
|
71 | // }
|
72 | // for (int c = 0; c < NUMPIXELSC; c++) {
|
73 | // strip_C.setPixelColor(c, whiteC);
|
74 | // strip_C.show();
|
75 | // delay(100);
|
76 | // }
|
77 | // for (int c = 0; c < NUMPIXELSA; c++) {
|
78 | // strip_C.setPixelColor(c, offC );
|
79 | // strip_C.show();
|
80 | // }
|
81 | sei(); // Enable Interrupts
|
82 | }
|
83 | void update_rpm() {
|
84 | rpm = 60 * (1000000 / (time * 1));
|
85 | rotDelay = 360000 / (rpm * 20);
|
86 | rotDelayA = ((rotDelay / 3) / 3);
|
87 | }
|
88 | void strips () {
|
89 | for (int a = 0; a < NUMPIXELSA; a++) {
|
90 | strip_A.setPixelColor(a, whiteA );
|
91 | strip_A.show();
|
92 | delay(rotDelay);
|
93 | }
|
94 | for (int a = 0; a < NUMPIXELSA; a++) {
|
95 | strip_A.setPixelColor(a, offA );
|
96 | strip_A.show();
|
97 | delay(rotDelay); for (int a = 0; a < NUMPIXELSA; a++) {
|
98 | strip_A.setPixelColor(a, whiteA );
|
99 | strip_A.show();
|
100 | delay(rotDelay);
|
101 | }
|
102 | for (int a = 0; a < NUMPIXELSA; a++) {
|
103 | strip_A.setPixelColor(a, offA );
|
104 | strip_A.show();
|
105 | delay(rotDelay);
|
106 | }
|
107 | delay(rotDelayA);
|
108 | for (int b = 0; b < NUMPIXELSB; b++) {
|
109 | strip_B.setPixelColor(b, whiteB );
|
110 | strip_B.show();
|
111 | delay(rotDelay);
|
112 | }
|
113 | for (int b = 0; b < NUMPIXELSB; b++) {
|
114 | strip_B.setPixelColor(b, offB );
|
115 | strip_B.show();
|
116 | delay(rotDelay);
|
117 | }
|
118 | delay(rotDelayA);
|
119 | for (int c = 0; c < NUMPIXELSC; c++) {
|
120 | strip_C.setPixelColor(c, whiteC );
|
121 | strip_C.show();
|
122 | delay(rotDelay);
|
123 | }
|
124 | for (int c = 0; c < NUMPIXELSC; c++) {
|
125 | strip_C.setPixelColor(c, offC );
|
126 | strip_C.show();
|
127 | delay(rotDelay);
|
128 | }
|
129 | delay(rotDelayA);
|
130 | }
|
131 | delay(rotDelayA);
|
132 | for (int b = 0; b < NUMPIXELSB; b++) {
|
133 | strip_B.setPixelColor(b, whiteB );
|
134 | strip_B.show();
|
135 | delay(rotDelay);
|
136 | }
|
137 | for (int b = 0; b < NUMPIXELSB; b++) {
|
138 | strip_B.setPixelColor(b, offB );
|
139 | strip_B.show();
|
140 | delay(rotDelay);
|
141 | }
|
142 | delay(rotDelayA);
|
143 | for (int c = 0; c < NUMPIXELSC; c++) {
|
144 | strip_C.setPixelColor(c, whiteC );
|
145 | strip_C.show();
|
146 | delay(rotDelay);
|
147 | }
|
148 | for (int c = 0; c < NUMPIXELSC; c++) {
|
149 | strip_C.setPixelColor(c, offC );
|
150 | strip_C.show();
|
151 | delay(rotDelay);
|
152 | }
|
153 | delay(rotDelayA);
|
154 | }
|
155 | void loop() {
|
156 | update_rpm(); // sensor ISR will look for time period
|
157 | if (last_rpm - rpm != 0 ) { // update LCD only if there is a change of rpm
|
158 | last_rpm = rpm;
|
159 | // need to check the case that there is 0 rpm (full stop)
|
160 | unsigned long currentMillis = millis();
|
161 | if (currentMillis - previousMillis > refreshInterval) { // at a decent refresh rate
|
162 | previousMillis = currentMillis;
|
163 | }
|
164 | }
|
165 |
|
166 | }
|
167 |
|
168 | ISR(INT0_vect) //Capture Hall via Interrupt
|
169 | {
|
170 | time = (micros() - time_last);
|
171 | time_last = micros();
|
172 | strips();
|
173 |
|
174 | }
|