//пины для светодиодов
int led11=11;
int led12=12;
int led13=13;
//пин датчика
int datchik=3;
//переменная для аналогового сигнала
long val;
//переменная для вывода значения магнитного поля в Гауссах
long magn_pole_G;
//переменная для вывода значения магнитного поля в Теслах
long magn_pole_T;
long timer_delay=0;
//библиотеки
#include <Adafruit_GFX.h>
#include "Adafruit_SSD1306.h"
//разрешение экрана
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Инициализируем OLED дисплей с помощью библиотеки Adafruit SSD1306
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Перечисление для состояний меню
enum MenuState {
START_MONITOR,
SHOWING_NUMBERS,
FUTURE,
};
// Стартовое состояние меню
MenuState currentMenu = START_MONITOR;
//кнопка
int state10;
const int buttonPin10 = 10;
int buttonState10=0; // текущее состояние вывода для кнопки 10
int lastButtonState10 = 1; // предыдущее состояние вывода для кнопки
unsigned long timer; // Таймер для замера длительности нажатия кнопки
void setup() {
Serial.begin(9600);
// Инициализация OLED дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Ошибка инициализации OLED дисплея"));
while (true);
}
// Очистка дисплея
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
//Инициализация пинов светодиодов и датчика
pinMode (led11, OUTPUT);
pinMode (led12, OUTPUT);
pinMode (led13, OUTPUT);
pinMode (datchik, INPUT_PULLUP);
timer_delay=millis();
magn_pole_G=0;
magn_pole_T=0;
//Начальное состояние светодиодов
digitalWrite(led11,LOW);
digitalWrite(led12,LOW);
digitalWrite(led13,LOW);
//кнопка
state10=0;
pinMode(buttonPin10, INPUT);
pinMode(buttonPin10, INPUT_PULLUP);
}
void loop() {
//функция которая будет всегда выполняться, сравнение аналогового значения
//с заданными границами и подсветка светодиодов
magnetic_field();
//меню для вывода на дисплей
switch (currentMenu) {
case START_MONITOR:
Start_monitor();
break;
case SHOWING_NUMBERS:
Showing_numbers();
break;
case FUTURE:
Future();
break;
}
// считываем состояние кнопки 10
int reading10 = digitalRead(buttonPin10);
// если кнопку отпустили
if ((reading10 != lastButtonState10)&&(reading10 !=0)) {
state10++;
}
switch(state10) {
case 0:
currentMenu=START_MONITOR;
break;
case 1:
currentMenu=SHOWING_NUMBERS;
break;
case 2:
currentMenu=FUTURE;
break;
case 3:
state10=0;
break;
}
lastButtonState10 = reading10;
//Преобразовываем аналоговый сигнал в Гаусы
magn_pole_G=((val*1.8)-921.6);
//Преобразовываем аналоговый сигнал в Теслы
magn_pole_T=(magn_pole_G*10000);
}
void magnetic_field() {
val=analogRead(datchik);
if (val>580)
{
analogWrite(led11,0);
analogWrite(led12,0);
analogWrite(led13,200);
}
else
{
if (val<560)
{
analogWrite(led11,200);
analogWrite(led12,0);
analogWrite(led13,0);
}
else
{
analogWrite(led11,0);
analogWrite(led12,200);
analogWrite(led13,0);
}
}
if (millis()-timer_delay>400)
{
Serial.print ("Значение аналогового сигнала ");
Serial.print(val);
Serial.println("; ");
timer_delay=millis();
}
}
void Showing_numbers() {
display.clearDisplay();
display.setCursor(64, 5);
display.println(val);
display.setCursor(64, 20);
display.print(magn_pole_G);
display.println(" G");
display.setCursor(64, 40);
display.print(magn_pole_T);
display.println(" T");
display.display();
}
void Start_monitor() {
display.clearDisplay();
display.setCursor(64, 32);
display.println("Welcome");
display.display();
}
void Future() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Beta testing is");
display.println("currently underway");
display.println("and this menu item");
display.println("is not available.");
display.println("Stay tuned");
display.println("for updates.");
display.display();
}