Hello everyone,
First off, as most have heard over and over, I'm a complete noob when it comes to arduino coding. I'm doing a project which should be so simple (and probably is for most) but I'm so stumped.
Here's what I'm doing.
This is for a 6 head shower system. I have a keypad that will turn/off each shower head by pressing each key. When any of the shower heads are turned on an oled display will turn on and display the water temperature.
My problem, I'm having trouble getting the display to stay on steady with live temperature readings. I either get stuck in the display loop and am not able to recognize the key presses. Or I can get the keys presses working but the display won't read live data.
I'm using an arduino mega. Below is my code
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>
#define OLED_DC 19
#define OLED_CS 17
#define OLED_CLK 20
#define OLED_MOSI 21
#define OLED_RESET 18
#define ThermistorPIN A1 // Analog Pin 1
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
float vcc = 4.91; // only used for display purposes, if used
// set to the measured Vcc.
float pad = 9850; // balance/pad resistor value, set this to
// the measured resistance of your pad resistor
float thermr = 10000; // thermistor nominal resistance
float Thermistor(int RawADC) {
long Resistance;
float Temp; // Dual-Purpose variable to save space.
Resistance=((1024 * pad / RawADC) - pad);
Temp = log(Resistance); // Saving the Log(resistance) so not to calculate it 4 times later
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15; // Convert Kelvin to Celsius
return Temp; // Return the Temperature
}
int Relay1 = 30;
int Relay2 = 32;
int Relay3 = 34;
int Relay4 = 36;
int Relay5 = 38;
int Relay6 = 40;
const int key1 = 11;
const int key2 = 10;
const int key3 = 9;
const int key4 = 8;
const int key5 = 7;
const int key6 = 6;
int PowerOff = 5;
int PowerOn = 0;
int s1 = 0;
int s2 = 0;
int s3 = 0;
int s4 = 0;
int s5 = 0;
int s6 = 0;
boolean toggle = false;
void setup() {
pinMode(Relay1, OUTPUT); // sets the digital pin as output
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
pinMode(Relay5, OUTPUT);
pinMode(Relay6, OUTPUT);
pinMode(key1, INPUT_PULLUP);
pinMode(key2, INPUT_PULLUP);
pinMode(key3, INPUT_PULLUP);
pinMode(key4, INPUT_PULLUP);
pinMode(key5, INPUT_PULLUP);
pinMode(key6, INPUT_PULLUP);
pinMode(PowerOff, INPUT_PULLUP);
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, HIGH);
digitalWrite(Relay3, HIGH);
digitalWrite(Relay4, HIGH);
digitalWrite(Relay5, HIGH);
digitalWrite(Relay6, HIGH);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
}
void loop() {
if (s1 == 0){
if (digitalRead(key1) == LOW){
PowerOn = 1;
s1 = 1;
delay (200);
}
}
if (s2 == 0){
if (digitalRead(key2) == LOW){
PowerOn = 1;
s2 = 1;
delay (200);
}
}
if (s3 == 0){
if (digitalRead(key3) == LOW){
PowerOn = 1;
s3 = 1;
delay (200);
}
}
if (s4 == 0){
if (digitalRead(key4) == LOW){
PowerOn = 1;
s4 = 1;
delay (200);
}
}
if (s5 == 0){
if (digitalRead(key5) == LOW){
PowerOn = 1;
s5 = 1;
delay (200);
}
}
if (s6 == 0){
if (digitalRead(key6) == LOW){
PowerOn = 1;
s6 = 1;
delay (200);
}
}
if (digitalRead(PowerOff) == LOW){
PowerOn = 0;
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextSize(3);
display.setCursor(0, 0);
display.print(" ");
display.display();
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, HIGH);
digitalWrite(Relay3, HIGH);
digitalWrite(Relay4, HIGH);
digitalWrite(Relay5, HIGH);
digitalWrite(Relay6, HIGH);
s1=0;
s2=0;
s3=0;
s4=0;
s5=0;
s6=0;
}
//if (PowerOn == 1){
float temp;
temp=Thermistor(analogRead(ThermistorPIN)); // Get Raw thermistor value
temp = (temp * 9.0)/ 5.0 + 32.0; // converts to Fahrenheit
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextSize(3);
display.setCursor(32, 8);
display.setTextColor(WHITE);
if (s1 == 1){
digitalWrite(Relay1, LOW);
display.print(temp,1);
}
if (s2 == 1){
digitalWrite(Relay2, LOW);
display.print(temp,1);
}
if (s3 ==1){
digitalWrite(Relay3, LOW);
display.print(temp,1);
}
if (s4 ==1){
digitalWrite(Relay4, LOW);
display.print(temp,1);
}
if (s5 ==1){
digitalWrite(Relay5, LOW);
display.print(temp,1);
}
if (s6 ==1){
digitalWrite(Relay6, LOW);
display.print(temp,1);
}
display.print(temp);
display.display();
//}
gettemp();
checkoffstate();
}
void gettemp(){
if (PowerOn == 1){
float temp;
temp=Thermistor(analogRead(ThermistorPIN)); // Get Raw thermistor value
temp = (temp * 9.0)/ 5.0 + 32.0; // converts to Fahrenheit
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextSize(3);
display.setCursor(32, 8);
display.setTextColor(WHITE);
display.print(temp,1);
display.display();
delay(500);
}
}
void getkey(){
if (s1 == 0){
if (digitalRead(key1) == LOW){
PowerOn = 1;
s1 = 1;
delay (100);
}
}
if (s2 == 0){
if (digitalRead(key2) == LOW){
PowerOn = 1;
s2 = 1;
delay (100);
}
}
if (s3 == 0){
if (digitalRead(key3) == LOW){
PowerOn = 1;
s3 = 1;
delay (100);
}
}
if (s4 == 0){
if (digitalRead(key4) == LOW){
PowerOn = 1;
s4 = 1;
delay (100);
}
}
if (s5 == 0){
if (digitalRead(key5) == LOW){
PowerOn = 1;
s5 = 1;
delay (100);
}
}
if (s6 == 0){
if (digitalRead(key6) == LOW){
PowerOn = 1;
s6 = 1;
delay (100);
}
}
}
void checkoffstate(){
if (s1 == 1){
if (digitalRead(key1) == LOW){
digitalWrite(Relay1,HIGH);
s1 = 0;
delay (200);
}
}
if (s2 == 1){
if (digitalRead(key2) == LOW){
digitalWrite(Relay2,HIGH);
s2 = 0;
delay (200);
}
}
if (s3 == 1){
if (digitalRead(key3) == LOW){
digitalWrite(Relay3,HIGH);
s3 = 0;
delay (200);
}
}
if (s4 == 1){
if (digitalRead(key4) == LOW){
digitalWrite(Relay4,HIGH);
s4 = 0;
delay (200);
}
}
if (s5 == 1){
if (digitalRead(key5) == LOW){
digitalWrite(Relay5,HIGH);
s5 = 0;
delay (200);
}
}
if (s6 == 1){
if (digitalRead(key6) == LOW){
digitalWrite(Relay6,HIGH);
s6 = 0;
delay (200);
}
}
}
Any help would be greatly appreciated. I know my code is not even close to optimal. I've written and re-written it about 50 times and I'm getting totally frustrated since this should be easy in my mind.