Arduino + DMSG-020 = Blow

// C++ , Arduino , DMSG-020 , SSD1306 , Blow

#include <EEPROM.h>

const int EEPROM_ADDR = 0; // Строка должна быть ТУТ, до setup!
bool License = false;      // И эта строка тоже тут

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define RELAY_PIN A0
#define Sensor_PIN A1 // Коричневый провод датчика
#define Sensor_GND A2 // Синий провод датчика (делаем из него минус)
#define switch_Delay_1 2
#define switch_Delay_2 3
#define switch_Delay_3 4
#define switch_Delay_4 5
#define switch_Delay_5 6
#define switch_Blow_1 7
#define switch_Blow_2 8
#define switch_Blow_3 9
#define switch_Blow_4 10
#define switch_Blow_5 11
#define switch_ON 12

  bool RePlay = false;
  bool Sensor = false;
  bool Relay = false;
  float Delay = 0.0;
  float Blow = 0.0;
 
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),  3(SCL), ...
//#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(128, 64, &Wire, -1);


void setup()
{
  delay(1000);
  Serial.begin(9600);
  Wire.begin();
  Wire.setWireTimeout(3000, true); // Защита от зависания шины (таймаут 3 мс)
  delay(1000);

  // EEPROM.write(EEPROM_ADDR, 50); // Пишем сколько
  byte runCount = EEPROM.read(EEPROM_ADDR);
  if (runCount > 0)
  {
    License = true;
    runCount--;
    EEPROM.write(EEPROM_ADDR, runCount);
    Serial.println("L:" + String(runCount));
  }
  else
  {
    License = false;
    Serial.println("L:0");
  }


  bool displayFound = false;   // Флаг: найден ли экран
  byte displayAddress = 0x00;   // Сюда запишем найденный адрес

  for (byte addr = 1; addr < 127; addr++)
  {
    Wire.beginTransmission(addr);
    byte error = Wire.endTransmission();

    if (error == 0)
    {
      displayFound = true;      // Отмечаем, что экран найден
      displayAddress = addr;    // Запоминаем адрес устройства
      Serial.println("i2c : 0x" + String(displayAddress, HEX));
      break;                    // ПРЕРЫВАЕМ ЦИКЛ, так как экран нашли!
    }
  }

  if (displayAddress == 0x00)
  {
    Serial.println("i2c : 0x" + String(displayAddress, HEX));
  }
  else
  {
    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
    if(!display.begin(SSD1306_SWITCHCAPVCC, displayAddress))
    {
      Serial.println(F("SSD1306 allocation failed"));
      for(;;); // Don't proceed, loop forever
    }
    //display.display(); // Рисуем вшитое лого
    //delay(1000);

    display.clearDisplay();
    //display.drawPixel(0, 0, SSD1306_WHITE);
    display.setTextSize(1);             // Размер шрифта: 1 — мелкий (высота 8 пикселей), 2 — крупнее и т.д.
    display.setTextColor(SSD1306_WHITE); // Цвет текста (белый)
    display.setCursor(0, 0);            // Самый верхний левый угол
    display.println("L:" + String(runCount));
    display.display();
    delay(1000);


  }
  digitalWrite(RELAY_PIN, HIGH);
  pinMode(RELAY_PIN, OUTPUT);

  pinMode(Sensor_GND, OUTPUT); // 1. Делаем из пина А2 искусственный GND (минус)
  digitalWrite(Sensor_GND, LOW); // На пине А2 теперь жесткий ноль (Земля)
  pinMode(Sensor_PIN, INPUT_PULLUP); // 2. Включаем пин А1 на вход с безопасной внутренней подтяжкой

  pinMode(switch_Delay_1, INPUT_PULLUP);
  pinMode(switch_Delay_2, INPUT_PULLUP);
  pinMode(switch_Delay_3, INPUT_PULLUP);
  pinMode(switch_Delay_4, INPUT_PULLUP);
  pinMode(switch_Delay_5, INPUT_PULLUP);
  pinMode(switch_Blow_1, INPUT_PULLUP);
  pinMode(switch_Blow_2, INPUT_PULLUP);
  pinMode(switch_Blow_3, INPUT_PULLUP);
  pinMode(switch_Blow_4, INPUT_PULLUP);
  pinMode(switch_Blow_5, INPUT_PULLUP);
  pinMode(switch_ON, INPUT_PULLUP);
}

void loop()
{
  drawMenu();

  //if (digitalRead(Sensor_PIN) == LOW) Sensor = true; else Sensor = false;
  //int sensorValue = analogRead(Sensor_PIN);
  if (analogRead(Sensor_PIN) < 700)
  {
    if (Sensor == false) Sensor = true; // Serial.print(sensorValue);
  }
  else
  {
    if (Sensor == true) Sensor = false; // Serial.print(sensorValue);
  }
 
  drawMenu();

  Delay = 0.0;
  if (digitalRead(switch_Delay_1) == LOW) Delay += 0.1;
  if (digitalRead(switch_Delay_2) == LOW) Delay += 0.2;
  if (digitalRead(switch_Delay_3) == LOW) Delay += 0.3;
  if (digitalRead(switch_Delay_4) == LOW) Delay += 0.4;
  if (digitalRead(switch_Delay_5) == LOW) Delay += 1.0;

  Blow = 0.0;
  if (digitalRead(switch_Blow_1) == LOW) Blow += 0.1;
  if (digitalRead(switch_Blow_2) == LOW) Blow += 0.2;
  if (digitalRead(switch_Blow_3) == LOW) Blow += 0.3;
  if (digitalRead(switch_Blow_4) == LOW) Blow += 0.4;
  if (digitalRead(switch_Blow_5) == LOW) Blow += 1.0;

  drawMenu();

  if (Sensor == false) RePlay = false;
  if (digitalRead(switch_ON) == LOW && Sensor == true && RePlay == false && License == true)
  {
    RePlay = true;

    display.invertDisplay(true);
    delay((unsigned long)(Delay * 1000));
    digitalWrite(RELAY_PIN, LOW); // ВКЛЮЧИТЬ реле (подать 5V)
    Relay = true;

    drawMenu();

    delay((unsigned long)(Blow * 1000));
    digitalWrite(RELAY_PIN, HIGH);  // ВЫКЛЮЧИТЬ реле (подать 0V)
    display.invertDisplay(false);
    Relay = false;

  }
 
  drawMenu();
}

void drawMenu()
{
  display.clearDisplay();
  display.setTextSize(2);             // Размер шрифта: 1 — мелкий (высота 8 пикселей), 2 — крупнее и т.д.
  display.setTextColor(SSD1306_WHITE); // Цвет текста (белый)
  display.setCursor(0, 0);            // Самый верхний левый угол
  display.print("Sensor ");
  if (Sensor == true) display.println(" ON"); else display.println("OFF");
  display.print("Relay  ");
  if (Relay == true) display.println(" ON"); else (display.println("OFF"));
  display.println("Delay  " + String(Delay, 1));
  display.println("Blow   " + String(Blow, 1));
  display.display();
}