/*****************************************************************
access timer with 128x64 I2C Oled display, light & sound signal
by Steve Barth 2021
*****************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_NeoPixel.h>
#define start_button 9 // connect start/stop button
#define Led_Green 10 // connect green led
#define Led_Red 11 //connect red led
#define buzzer 12 //connect speaker
#define delayval 80 // del 80ms
#define NUMPIXELS 16
int timerMode = 0; // data type for timer mode
long startTime; // data type for starting time
bool Led_Red_state; // data type for red led state
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// (SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET)
Adafruit_SSD1306 oled(128, 64, & Wire, 4);
Adafruit_NeoPixel pix = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_GRB + NEO_KHZ800);
void Ring()
{
for (int i = 16; i <= NUMPIXELS; i--)
{
pix.setPixelColor(i, pix.Color(10, 250, 10));
pix.show(); // updated pixel color
delay(delayval);
//Serial.println(i);
pix.setPixelColor(i, pix.Color(0, 0, 0));
/*
if (i > 16)
{
i = 0;
}
pix.setPixelColor(i, pix.Color(0, 0, 0));
/*
if ( i < 1 )
{
i = 12;
}
*/
}
}
/************** SETUP ***************/
void setup()
{
oled.setRotation(2); // oled screen display rotation
//Serial.begin(9600); // serial monitor init
oled.begin(SSD1306_SWITCHCAPVCC, 0x3D); // OLED display initialize, address setting
oled.clearDisplay(); // clear screen
oled.display(); // display enable
delay(100); // Pause 0.1 seconds for display
pinMode(start_button, INPUT_PULLUP); // setting pinmode with pullup resistor
pinMode(Led_Green, OUTPUT); // setting pinmode output for green led
digitalWrite(Led_Green, LOW); // green led off
pinMode(Led_Red, OUTPUT); // setting pinmode output for red led
digitalWrite(Led_Red, LOW); // red led off
pinMode(buzzer, OUTPUT); // setting pinmode output for speaker
pix.begin();
pix.show(); // Initialize all pixels to 'off'
}
/************** LOOP ***************/
void loop()
{
noTone(12); // sound off
Led_Red_state = 0; // red led mode status 0
if (timerMode == 0 )
{ // if red led "0" mode status
oled.clearDisplay(); // clear screen
oled.setTextSize(1); // setting text size
oled.setTextColor(WHITE); // text color (black background, white foreground)
oled.setCursor(30, 8); // cursor position
oled.print("PLEASE NEXT,"); // text on the display
oled.setCursor(35, 25); // cursor position
oled.print("STOP NOW!"); // text on the display
oled.display(); // display enable
}
if (digitalRead(start_button) == LOW)
{ // if push button
delay(150); // delay for no bounce
startTime = millis(); // start time settings
timerMode++; // I increase the mode status by 1
//Serial.print("timerMode: "); // serial monitor display text
//Serial.println(timerMode); // serial monitor display mode state
}
if (timerMode == 1)
{ // if red led "1" mode status
oled.clearDisplay(); // clear screen
oled.setTextSize(1); // setting text size
oled.setTextColor(WHITE); // text color (black background, white foreground)
oled.setCursor(4, 26); // cursor position
oled.print("(Measurment: 5 sec.)"); // text on the display
oled.setTextSize(2); // setting text size
oled.setTextColor(WHITE); // text color (black background, white foreground)
oled.setCursor(15, 40); // cursor position
oled.print((millis() - startTime) / 1000.0);
//Serial.println(millis()-startTime);
oled.setCursor(70, 40); // cursor position
oled.print("sec."); // text on the display
oled.display(); // display enable
if ((millis() - startTime) >= 5001)
{ // time max.: 5 sec
timerMode++; // I increase the mode status by 1
}
}
else if (50 <= (millis() - startTime) <= 4950 && timerMode >= 1)
{ // if time between 0,05s-4,95s
digitalWrite(Led_Red, HIGH); // red led on
Led_Red_state = 1; // red led mode status 1
}
if (timerMode > 1 )
{ // if mode status bigger 1
//Serial.print("timerMode: ");
//Serial.println(timerMode);
if (Led_Red_state == 0)
{ // if red led mode status 0
oled.setTextSize(1); // setting text size
oled.setTextColor(WHITE); // text color (black background, white foreground)
oled.setCursor(0, 6); // cursor position
oled.print("All right! PLEASE, GO"); // text on the display
oled.display(); // display enable
//Ring(); //?? program stop??
digitalWrite(Led_Green, HIGH);
//Serial.println("All right! Please, GO!");
tone(12, 900, 400); // Plays 800 Hz tone for 0.4 seconds
delay(100); // 0,12 seconds delay
tone(12, 1200, 400); // Plays 1kHz tone for 0.4 seconds
delay(75); // 0,1 seconds delay
tone(12, 1500, 400); // Plays 1,2kHz tone for 0.4 seconds
delay(50); // 0,08 seconds delay
noTone(buzzer); // sound off
}
if (Led_Red_state == 1) { // if red led mode status 1
oled.setTextSize(1); // setting text size
oled.setTextColor(WHITE); // text color (black background, white foreground)
oled.setCursor(2, 6); // cursor position
oled.print("It's not okay, AGAIN!"); // text on the display
oled.display(); // display enable
//Serial.println("It's not okay, AGAIN!");
tone(12, 330, 600); // Plays 330Hz tone for 0.6 seconds
delay(600); // 0,6 seconds delay
noTone(buzzer); // sound off
}
delay (1600); // 1,6 seconds delay before clear screen
oled.clearDisplay(); // clear screen
//SetPixels();
digitalWrite(Led_Red, LOW);
digitalWrite(Led_Green, LOW);
//delay(100);
timerMode = 0; // set mode status 0
//Serial.print("timerMode: ");
//Serial.println(timerMode);
}
}