Including push-button to thermometer

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? :slight_smile: :slight_smile:

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