#include <SevenSegmentTM1637.h>
#define EPSILON 3.3f
#define PATH_LENGTH 1.0f
#define CLK 3
#define DIO 4
const uint8_t LED_PIN = 6;
const uint8_t PHOTO_PIN = 2;
const uint8_t BUTTON_PIN = 5;
int buttonState = 0;
int lastButtonState = 0;
unsigned long buttonPressTime = 0;
unsigned long buttonReleaseTime = 0;
int mode = -1;
int blank = 0;
float absorbance = 0.0;
byte sampleCount = 0;
TM1637Display display(CLK, DIO);
void showNumber(float number) {
int digits[4];
for (int i = 0; i < 4; i++) {
digits[i] = int(number * 10) % 10;
number *= 10;
}
int photoValue = analogRead(PHOTO_PIN);
float absorption = EPSILON * PATH_LENGTH * photoValue / 1023;
int absorptionInt = round(absorption * 1000);
display.showNumberDecEx(absorptionInt, 0b00001111, 4, 0); // Display absorption value with rotating segments
}
void uvLedOn() {
digitalWrite(LED_PIN, HIGH);
}
void uvLedOff() {
digitalWrite(LED_PIN, LOW);
}
void measureBlank() {
uvLedOn();
blank = analogRead(PHOTO_PIN);
uvLedOff();
display.showNumberDecEx(0, 0b01000000, 2, 0); // Display "0000" with rotating segments
}
void calculateAbsorbance() {
uvLedOn();
int value = analogRead(PHOTO_PIN);
absorbance = blank - value;
uvLedOff();
display.showNumberDecEx(1, 0b00010000, 2, 0); // Display "1111" with rotating segments
}
void setup() {
pinMode(LED_PIN, OUTPUT);
display.setBrightness(7);
display.begin(); // Add this line to initialize the display
showNumber(0);
}
int pressDuration = 0;
void loop() {
buttonState = digitalRead(BUTTON_PIN);
if (pressDuration > 3 && mode != 1) {
mode = -1; // Set the mode to -1 for standby mode
showNumber(0);
}
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonPressTime = millis();
}
if (buttonState == LOW) {
buttonReleaseTime = millis();
pressDuration = (buttonReleaseTime - buttonPressTime) / 1000;
if (pressDuration > 3) {
mode = 0;
showNumber(0);
}
else {
mode++;
switch (mode) {
case -1:
showNumber(0);
break;
case 0:
showNumber(0);
break;
case 1:
measureBlank();
break;
case 2:
showNumber(0.1);
sampleCount = 1;
break;
case 3:
calculateAbsorbance();
break;
default:
showNumber(sampleCount);
sampleCount++;
break;
}
}
delay(100);
}
lastButtonState = buttonState;
}
if (mode == 3 || mode == 4 || mode > 4) {
calculateAbsorbance();
showNumber(absorbance);
}
}