While my circuit worked, and my code was relatively simple, it was a pain to adjust if I wanted to change the value ranges quickly. Also, if I wanted to add more LEDs, I would need to write an entire "if" statement for each addition. Then, I worked through turning my original code into one using the C++ class structure. (Thanks PK for walking me through this!) The resulting code is below, annotated so I can remember how to create class structures in the future:
class rgb { //name class & original variables
int LED; //each LED pin
int min; //minimum value (from hall sensor)
int max; //maximum value (from hall sensor)
public: rgb(int LEDpin, int minval, int maxval){ //these will be variables that we change for every LED in rgb
LED = LEDpin; //label these variables differently so we can refer to them later
min = minval; //but they are referring the same thing
max = maxval;
pinMode(LED, OUTPUT); //make sure the LED is the output of the fxn since that is what turns on/off
}
Update(int value){ //this takes the value received from the hall sensor to use in "if" statement
if (value > min && value < max) { //if the value is between two numbers (we decide what min/max are)
digitalWrite(LED, HIGH); //turn LED on
} else { //otherwise
digitalWrite(LED, LOW); //turn LED off
}
}
};
rgb led1(10, 50, 63); //led1 is in class rgb, connected to pin 10 with minimum value = 50 and maximum = 63
rgb led2(9, 63, 350); //led2 is in class rgb, connected to pin 9 with minimum value = 63 and maximum = 350
rgb led3(8, 350, 500); //led3 is in class rgb, connected to pin 8 with minimum value = 350 and maximum = 500
int Hall = 0; //set up Hall sensor input into pin A0
void setup() {
Serial.begin(9600); //for reading the Hall sensor (can see results of this step in serial monitor)
}
void loop() {
int value = analogRead(Hall); //label the term "value" as the reading from the Hall sensor
led1.Update(value); //apply the if statement from Update to led1 using the value from the Hall sensor
led2.Update(value); //apply the if statement from Update to led2 using the value from the Hall sensor
led3.Update(value); //apply the if statement from Update to led1 using the value from the Hall sensor
}
Now all I need to do to adjust or add to my circuit is change two single lines at the bottom, instead of scrolling through mulitple if statements to find what I am looking for. Satisfied with my input/output device, I moved on to the oscilloscope to see what voltages my output device was using. Since my output device is not based on time, I only expected a change in the voltage reading when I exposed the Hall sensor to a magnet. This graph on the oscilloscope is exactly what I expected:
Each of the square pulses corresponds me holding the magnet above the Hall sensor, which means that when the RGB LED has an output around 2V if the Hall sensor allows the Arduino board to send a signal. The skinnier pulses are from when I held the magnet for a small amount of time, and the wider one is from when I left the magnet over the sensor for longer time. Also, you may have noticed that I re-did my website! I am still working on adding back the previous weeks' content, but I've saved my old files so I still have them. Below is a video of my circuit in action: