#include "pin_configuration.h"
#include <SevSeg.h>
#include <Button.h>
#include "Adafruit_SHT4x.h"
SevSeg sevseg;
Adafruit_SHT4x humiditySensor = Adafruit_SHT4x();
bool lastButtonState = false;
const byte MODE_TEMPERATURE = 0;
const byte MODE_HUMIDITY = 1;
const byte MODE_CURRENT = 2;
const byte MODE_COUNT = 3;
byte mode = MODE_TEMPERATURE;
long lastSensorUpdate = 0;
const int SENSOR_UPDATE_PERIOD = 500; // milli seconds
void setup();
void loop();
byte evaluateMode();
void displayValue(byte mode);
void indicateState(byte mode);
int readTemperature();
int readHumidity();
double readCurrent();
void setup() {
Serial.begin(9600);
delay(1000);
int NUMBER_OF_DIGITS = 3;
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]
humiditySensor.begin();
humiditySensor.setPrecision(SHT4X_HIGH_PRECISION);
humiditySensor.setHeater(SHT4X_NO_HEATER);
sevseg.begin(
COMMON_CATHODE,
NUMBER_OF_DIGITS,
PINS_7_SEGMENT_DISPLAY_DIGITS,
PINS_7_SEGMENT_DISPLAY_SEGMENTS,
resistorsOnSegments,
updateWithDelays,
leadingZeros,
disableDecPoint
);
pinMode(PIN_BUTTON, INPUT);
pinMode(PIN_TEMPERATURE, INPUT);
pinMode(PIN_GREEN_LED, OUTPUT);
pinMode(PIN_BLUE_LED, OUTPUT);
pinMode(PIN_RED_LED, OUTPUT);
}
void loop() {
sevseg.refreshDisplay();
mode = evaluateMode();
indicateState(mode);
displayValue(mode);
}
bool buttonPressed(){
bool pressed = false;
bool currentButtonState = digitalRead(PIN_BUTTON);
if(!lastButtonState && currentButtonState){
pressed = true;
}
lastButtonState = currentButtonState;
return pressed;
}
// determines and returns the current state
byte evaluateMode() {
// determine the state based on the current state and the button
// if you exprerience unexpected behaviour of the push button
// look into "debouncing"
if (buttonPressed()){
mode = ((mode + 1) % MODE_COUNT);
Serial.print("next mode: ");
Serial.println(mode);
}
return mode;
}
// indicate the current Mode using LEDs
void indicateState(byte mode) {
// Serial.print("indicate mode ");
// Serial.println(mode);
digitalWrite(PIN_RED_LED, mode == MODE_TEMPERATURE ? HIGH : LOW);
digitalWrite(PIN_BLUE_LED, mode == MODE_HUMIDITY ? HIGH : LOW);
digitalWrite(PIN_GREEN_LED, mode == MODE_CURRENT ? HIGH : LOW);
}
// read the value according to the provided
// mode and show it on the 7 segment display
void displayValue(byte mode) {
long now = millis();
if (now < lastSensorUpdate + SENSOR_UPDATE_PERIOD) return;
lastSensorUpdate = now;
Serial.print("display value for mode ");
Serial.print(mode);
Serial.print(": ");
switch (mode) {
case MODE_TEMPERATURE:
Serial.println(readTemperature());
sevseg.setNumber(readTemperature());
break;
case MODE_HUMIDITY:
Serial.println(readHumidity());
sevseg.setNumber(readHumidity());
break;
case MODE_CURRENT:
sevseg.setNumberF(readCurrent(), 1);
Serial.println(readCurrent());
break;
default:
Serial.println("Unknown mode");
}
}
// read the ADC value, convert it to the desired unit (°C) and return it
// returns: int temperature in °C
int readTemperature() {
int adcValue = analogRead(PIN_TEMPERATURE);
int temperature = (int) adcValue / 1023.0 * 80 - 20;
return temperature;
}
// read the ADC value, calculate the humidity in % (int) and return it
int readHumidity() {
sensors_event_t humidityEvent, tempEvent;
humiditySensor.getEvent(&humidityEvent, &tempEvent);// populate temp and humidity objects with fresh data
int humidity = (int) humidityEvent.relative_humidity;
return humidity;
}
// read the ADC value, calculate the current in mA (double) and return it
double readCurrent() {
int adcValue = analogRead(PIN_CURRENT);
double current = map(adcValue,0,1023,0,200)/10.0; // in mA
return current;
}