#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Ширина OLED дисплея
#define SCREEN_HEIGHT 64 // Высота OLED дисплея
// Инициализируем OLED дисплей с помощью библиотеки Adafruit SSD1306
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Пины для кнопок
const int buttonPin1 = 7;
const int buttonPin2 = 8;
const int buttonPin3 = 9;
// Пины для датчика удара, светодиода и пищалки
const int shockSensorPin = 2;
const int ledPin = 3;
const int buzzerPin = 4;
// Переменные для хранения состояния кнопок
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
bool alarmEnabled = false;
// Перечисление для состояний меню
enum MenuState {
VIEW,
ALARM,
SPEED
};
// Текущее состояние меню
MenuState currentMenu = VIEW;
void setup() {
Serial.begin(9600);
// Инициализация OLED дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Oled display error"));
while (true);
}
// Очистка дисплея
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Инициализация пинов для кнопок
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
// Инициализация пинов для датчика удара, светодиода и пищалки
pinMode(shockSensorPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
updateButtons();
switch (currentMenu) {
case VIEW:
menuView();
break;
case ALARM:
menuAlarm();
break;
case SPEED:
menuSpeed();
break;
}
}
// Обновление состояния кнопок
void updateButtons() {
buttonState1 = !digitalRead(buttonPin1);
buttonState2 = !digitalRead(buttonPin2);
buttonState3 = !digitalRead(buttonPin3);
if (buttonState1 == HIGH) {
currentMenu = VIEW;
disableAlarm();
}
if (buttonState2 == HIGH) {
currentMenu = ALARM;
disableAlarm();
}
if (buttonState3 == HIGH) {
currentMenu = SPEED;
disableAlarm();
}
}
void menuView() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("KY-002 state:");
if (digitalRead(shockSensorPin) == HIGH) {
display.println("Worked");
} else {
display.println("Didn't worked");
}
display.display();
}
// Функция для активации сигнализации
void menuAlarm() {
display.clearDisplay();
display.setCursor(0, 0);
if(digitalRead(shockSensorPin) == HIGH)
alarmEnabled = true;
if(alarmEnabled) {
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000); // Проигрываем звуковой сигнал
display.println("Alarm");
} else {
display.println("No alarm");
}
display.display();
}
void menuSpeed() {
static unsigned long previousTime = millis();
static int counter = 0;
static int lastCounter = 0;
static int lastSensorState = LOW;
unsigned long currentTime = millis(); // Получение текущего времени в микросекундах
int reading = digitalRead(shockSensorPin);
static unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
static int sensorState;
if (reading != lastSensorState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != sensorState) {
sensorState = reading;
if (sensorState == HIGH) {
counter++;
}
}
}
lastSensorState = reading;
float speed = 0.0;
if (currentTime - previousTime >= 3000) { // Измерение каждую миллисекунду
Serial.println("Update");
speed = abs(counter - lastCounter);
lastCounter = counter;
previousTime = currentTime; // Обновление времени последнего измерения
display.clearDisplay();
display.setCursor(0, 0);
display.println("Speed:");
display.println(speed);
display.display();
}
}
void disableAlarm() {
alarmEnabled = false;
digitalWrite(ledPin, LOW);
noTone(buzzerPin); // Проигрываем звуковой сигнал
}