wvmarle:
Do debounce your button (either in hardware or software - plenty of examples out there). I assume same sensor on all pins, so you just have to provide the correct pin and read that sensor. Change the number of sensors to your number.
So, I've got the 2nd sensor now and everything seems to be working OK apart from the button. It's working randomly so I think the problem is with the debouncing.
Any ideas what did I do wrong?
![]()
Here is the whole code:
#include <Servo.h> // include Servo library
Servo myServo;
int sensorValueTemp;
int heartBeat = 0;
int blinkingMIN = 0;
int blinkingMAX = 0;
int angle1; // angle to be rotated by servo when sensing temperature
int angle2; // angle to be ratated by servo when sensing humidity
int buttonState = LOW;
int ledState = 0;
int selectedSensor;
int sensorValHum;
const int humiditySensor = A1; // pin connected to humidity sensor
const int tempSensor = A0; // pin connected to temperature sensor
const int button = 11; // push-button attached to this pin
const int led = 12; // which sensor is reading; ON=temperature, OFF=humidity
float temperature;
float voltage;
float sensorRH;
float trueRH;
const float roomTemp = 21;
unsigned long timer1;
unsigned long timer2;
unsigned long timer3;
unsigned long timer4;
unsigned long timer5;
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
void setup() {
myServo.attach(9,480,2240); // (servo attached to pin 9, minimum pulse, servo maximum pulse)
Serial.begin(9600); // open a serial connection to display values
// set the LED button and sensors as inputs
pinMode(button, INPUT);
pinMode(tempSensor, INPUT);
// set the LED pins as outputs
pinMode(13, OUTPUT);
pinMode(led, OUTPUT);
for (int pinNumber = 2; pinNumber < 8; pinNumber++) {
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, LOW);
}
//LED test at startup
digitalWrite(2,HIGH);
delay(100);
digitalWrite(3,HIGH);
delay(100);
digitalWrite(4,HIGH);
delay(100);
digitalWrite(5,HIGH);
delay(100);
digitalWrite(6,HIGH);
delay(100);
digitalWrite(7,HIGH);
delay(500);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
digitalWrite(3,LOW);
digitalWrite(2,LOW);
delay(500);
}
void loop() {
// Make the LED blink
if (millis() - timer1 > 500){
heartBeat = !heartBeat;
digitalWrite (13, heartBeat);
timer1 = millis();
}
buttonState = digitalRead(button);
if(digitalRead(button)) {
selectedSensor++;
if(selectedSensor > 2)
selectedSensor = 1;
}
switch(selectedSensor) {
case 1:
analogRead(tempSensor);
if(millis() - lastDebounceTime1 > 100) {
if((buttonState == HIGH) && (ledState < 0)) {
digitalWrite(led, HIGH);
ledState = !ledState;
lastDebounceTime1 = millis();
}
else if((buttonState == HIGH) && (ledState > 0)) {
digitalWrite(led, LOW);
ledState = !ledState;
lastDebounceTime2 = millis();
}
}
// update sensor value at 1Hz and print the values to serial monitor
if(millis() - timer2 > 1000) {
sensorValueTemp = analogRead(tempSensor);
temperature = (5.0 * sensorValueTemp * 100.0) / 1024;
Serial.print("degrees C: ");
Serial.println(temperature);
timer2 = millis();
angle1 = map(temperature, 21, 28, 0, 180); // we map sensorValue between min and max and 0 and 180ΒΊ
myServo.write(angle1);
}
// if the current temperature is lower than the roomTemp: turn off all LEDs and blink the LED in pin 2 -> temperature under minimum value
if (temperature < roomTemp + 2) {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
// Make the LED blink
if (millis() - timer3 > 500){
blinkingMIN = !blinkingMIN;
digitalWrite (2, blinkingMIN);
timer3 = millis();
}
}
// if the temperature rises 2-3 degrees: turn an LED on
else if (temperature >= roomTemp + 2 && temperature < roomTemp + 3) {
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
// if the temperature rises 3-4 degrees: turn a second LED on
else if (temperature >= roomTemp + 3 && temperature < roomTemp + 4) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(3, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
// if the temperature rises 4-5 degrees: turn a third LED on
else if (temperature >= roomTemp + 4 && temperature < roomTemp + 5) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
// if the temperature rises 5-6 degrees: turn a fourth LED on
else if (temperature >= roomTemp + 5 && temperature < roomTemp + 6) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
// if the temperature rises 6-7 degrees, turn a fifth LED on
else if (temperature >= roomTemp + 6 && temperature < roomTemp + 7) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
}
// if the temperature goes 7 degrees over the roomTemp: turn on all LEDs and blink the led in pin 7 -> maximum value has been crossed
else if (temperature >= roomTemp + 7) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
// Make the LED blink
if (millis() - timer4 > 500) {
blinkingMAX = !blinkingMAX;
digitalWrite (7, blinkingMAX);
timer4 = millis();
}
}
break;
case 2:
analogRead(humiditySensor);
if(millis() - lastDebounceTime2 > 100) {
if((buttonState == HIGH) && (ledState < 0)) {
digitalWrite(led, HIGH);
ledState = !ledState;
lastDebounceTime2 = millis();
}
else if((buttonState == HIGH) && (ledState > 0)) {
digitalWrite(led, LOW);
ledState = !ledState;
lastDebounceTime2 = millis();
}
}
if(millis() - timer5 > 1000){
// read the sensor:
sensorValHum = analogRead(humiditySensor);
// convert to voltage:
voltage = (5.0 * sensorValHum) / 1024.0;
sensorRH = (voltage - 0.958) / 0.03068;
trueRH = (sensorRH) / (1.0546 - 0.00216 * 21);
// print the results:
Serial.print("Humidity: ");
Serial.print(trueRH);
Serial.println("%");
timer5 = millis();
angle2 = map(trueRH, 0, 100, 0, 180);
myServo.write(angle2);
}
break;
}
}
Thanks, Jonathan