make-this-a-little-less-painful #2

Open
Cynopolis wants to merge 2 commits from make-this-a-little-less-painful into main
Showing only changes of commit feaed67e8f - Show all commits
+76 -58
View File
@@ -1,31 +1,92 @@
#include <Arduino.h> #include <Arduino.h>
#include <Encoder.h> #include <Encoder.h>
#include <LiquidCrystal_I2C.h> #include <LiquidCrystal_I2C.h>
#include <cstdint>
#define encoder_pin_a 2 static constexpr uint8_t ENCODER_PIN_A{2};
#define encoder_pin_b 3 static constexpr uint8_t ENCODER_PIN_B{3};
#define a_sec 1000000
// LCD Address is 0x27 // LCD Address is 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2); LiquidCrystal_I2C lcd(0x27, 16, 2);
Encoder encoder(encoder_pin_a, encoder_pin_b); Encoder encoder(ENCODER_PIN_A, ENCODER_PIN_B);
unsigned long encoder_timer = 0; unsigned long encoder_timer = 0;
float encoder_new = 0;
float encoder_old = 0; float encoder_old = 0;
float frequency = 0; float frequency = 0;
unsigned int on_time = 100; static constexpr uint32_t onTime{100};
boolean is_on = false; uint32_t timer;
unsigned long timer;
/**
* @brief Update a display with the frequency and RPM information
* @param display a reference to the display option to update
* @param frequency the current frequency the LED is blinking at
*/
void UpdateDisplay(LiquidCrystal_I2C &display, float new_frequency) {
display.setCursor(0, 0); // Set cursor to character 2 on line 0
display.print("Frequency:");
display.print(new_frequency);
display.setCursor(0, 1); // Move cursor to character 2 on line 1
display.print("RPM:");
display.print(new_frequency * 60);
}
inline void SetPin5() { PORTD = PORTD | 0b00100000; }
inline void ClearPin5() { PORTD = PORTD & 0b11011111; }
float UpdateFrequency(Encoder &encoder, float oldFrequency, float &encoderOld) {
float newFrequency = oldFrequency;
float encoderNew = float(encoder.read()) / 8;
if (encoderNew != encoderOld && millis() - encoder_timer > 100) {
float difference = encoderNew - encoderOld;
newFrequency = oldFrequency + pow(difference, 3);
encoderOld = encoderNew;
if (newFrequency < 0 || newFrequency > 2000 || encoderNew < 0) {
newFrequency = 0;
encoderNew = 0;
encoderOld = 0;
}
UpdateDisplay(lcd, newFrequency);
encoder_timer = millis();
}
return newFrequency;
}
void Flash(bool &isOn, uint32_t &timer, float frequency, uint32_t onTime) {
static constexpr float MICROSECONDS_PER_SECOND{1000000};
// Don't bother flashing if the frequency is 0
if (frequency == 0) {
return;
}
if (isOn == true) {
// Wait a set amount of time and then turn the LED off
if (micros() - timer >= onTime) {
ClearPin5();
}
// wait the rest of the off period then reset the clock
if ((micros() - timer) >= MICROSECONDS_PER_SECOND / frequency - onTime) {
isOn = false;
timer = micros();
}
} else {
// Turn on the LED
SetPin5();
isOn = true;
}
}
void setup() { void setup() {
// put your setup code here, to run once: // put your setup code here, to run once:
Serial.begin(9600); Serial.begin(9600);
pinMode(5, OUTPUT); pinMode(5, OUTPUT);
// Turn off pin 5 // Turn off pin 5
PORTD = PORTD & B11011111; SetPin5();
encoder_new = encoder.read();
encoder_old = encoder.read(); encoder_old = encoder.read();
timer = micros(); timer = micros();
encoder_timer = millis(); encoder_timer = millis();
@@ -33,56 +94,13 @@ void setup() {
lcd.init(); lcd.init();
lcd.clear(); lcd.clear();
lcd.backlight(); lcd.backlight();
lcd.setCursor(0,0); //Set cursor to character 2 on line 0 UpdateDisplay(lcd, frequency);
lcd.print("Frequency:");
lcd.print(frequency);
lcd.setCursor(0,1); //Move cursor to character 2 on line 1
lcd.print("RPM:");
lcd.print(frequency*60);
} }
void loop() { void loop() {
// Get encoder data // Get the new frequency from the encoder
float encoder_new = float(encoder.read())/8; frequency = UpdateFrequency(encoder, frequency, encoder_old);
if (encoder_new != encoder_old && millis() - encoder_timer > 100) {
float difference = encoder_new - encoder_old;
frequency = frequency + pow(difference, 3); // Turn on or off the LED at the right time
encoder_old = encoder_new; Flash(frequency, timer, onTime);
if(frequency < 0 || frequency > 2000 || encoder_new < 0){
frequency = 0;
encoder_new = 0;
encoder_old = 0;
}
lcd.setCursor(0,0); //Set cursor to character 2 on line 0
lcd.print("Frequency:");
lcd.print(frequency);
lcd.setCursor(0,1); //Move cursor to character 2 on line 1
lcd.print("RPM:");
lcd.print(frequency*60);
encoder_timer = millis();
}
if(frequency != 0){
if(is_on == true){
// Wait a set amount of time and then turn the LED off
if(micros()-timer >= on_time){
PORTD = PORTD & B11011111;
}
// wait the rest of the off period then reset the clock
if((micros()-timer) >= a_sec/frequency - on_time){
is_on = false;
timer = micros();
}
}
else{
// Turn on the LED
PORTD = PORTD | B00100000;
is_on = true;
}
}
} }