// Version 1.0.1
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>
#define OLED_RESET -1 // Пин сброса (или -1, если используется сброс Arduino)
#define SCREEN_WIDTH 128 // Ширина OLED дисплея в пикселях
#define SCREEN_HEIGHT 32 // Высота OLED дисплея в пикселях
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int sensorPin = A0; // Пин для подключения датчика температуры (через LM358)
const int voltageSensorPin = A1; // Пин для датчика напряжения (через резистивный делитель)
const int currentSensorPin = A2; // Пин для датчика тока (через LM358)
const int heaterPin = 3; // Пин для управления паяльником
const int buzzerPin = 5; // Пин для пищалки
const int encoderPinA = 2; // Пин A энкодера
const int encoderPinB = 4; // Пин B энкодера
const int encoderButtonPin = 6; // Пин кнопки энкодера
const int maxTemp = 450; // Максимальная температура в градусах Цельсия
int desiredTemp = 200; // Желаемая температура в градусах Цельсия
double currentTemp = 0.0;
double voltage = 0.0;
double currentAmp = 0.0;
bool heaterEnabled = false; // Переменная для отслеживания состояния паяльника (включен/выключен)
long lastEncoderPos = 0; // Переменная для отслеживания последней позиции энкодера
Encoder myEnc(encoderPinA, encoderPinB); // Инициализация энкодера
void setup() {
// Инициализация дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("MITA v1.01")); // Название паяльной станции
display.display();
delay(2000); // Отображаем надпись MITA на 3 секунды
// Звуковой сигнал при включении
tone(buzzerPin, 5000); // Включаем пищалку с частотой 5 КГц
delay(500); // Задержка 1 секунда
noTone(buzzerPin); // Выключаем пищалку
// Настройка пинов
pinMode(heaterPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(encoderButtonPin, INPUT_PULLUP); // Включаем внутренний Pull-Up резистор для кнопки энкодера
digitalWrite(heaterPin, LOW); // Пока паяльник выключен
digitalWrite(buzzerPin, LOW); // Пищалка выключена
// Начало сериал
Serial.begin(9600);
}
void loop() {
// Считывание температуры
int sensorValue = analogRead(sensorPin);
currentTemp = map(sensorValue, 0, 1023, 0, 500); // Предполагаем, что 1023 - это максимальное значение, 0 - минимальное, и переводим в градусы Цельсия
// Считывание напряжения
int voltageValue = analogRead(voltageSensorPin);
voltage = (voltageValue / 1023.0) * 5.0 * 10; // Пример преобразования, предполагая делитель напряжения 10:1
// Считывание тока через LM358
int currentValue = analogRead(currentSensorPin);
double sensorVoltage = (currentValue / 1023.0) * 5.0;
double voltageAcrossShunt = sensorVoltage / 100; // Усиление в 100 раз
double shuntResistance = 0.01; // Резистор 0.01 Ом
currentAmp = voltageAcrossShunt / shuntResistance;
// Обработка поворота энкодера для изменения температуры
long newEncoderPos = myEnc.read() / 4; // Делим на 4 для более плавного управления
if (newEncoderPos != lastEncoderPos) {
desiredTemp += (newEncoderPos - lastEncoderPos) * 10; // Изменяем желаемую температуру
lastEncoderPos = newEncoderPos;
tone(buzzerPin, 2000, 100); // Включаем пищалку с частотой 2000 Гц на 100 мс
}
// Обработка нажатия кнопки энкодера для включения/выключения паяльника
if (digitalRead(encoderButtonPin) == LOW) {
heaterEnabled = !heaterEnabled; // Переключаем состояние паяльника
tone(buzzerPin, 1000, 100); // Включаем пищалку с частотой 1000 Гц на 100 мс
delay(100); // Задержка для предотвращения дребезга кнопки
}
// Отображение информации на дисплее
display.clearDisplay();
display.setCursor(0, 0);
display.print(F("CurTemp: "));
display.print(currentTemp);
display.println(F(" C"));
display.print(F("DesTemp: "));
display.print(desiredTemp);
display.println(F(" C"));
display.print(F("Voltage: "));
display.print(voltage);
display.println(F(" V"));
display.print(F("Heater: "));
display.println(heaterEnabled ? F("ON") : F("OFF"));
display.display();
// Управление паяльником
if (heaterEnabled) {
if (currentTemp < desiredTemp) {
digitalWrite(heaterPin, HIGH); // Включаем нагрев
} else {
digitalWrite(heaterPin, LOW); // Выключаем нагрев
}
} else {
digitalWrite(heaterPin, LOW); // Выключаем нагрев, если паяльник выключен
}
// Проверка на максимальную температуру
if (currentTemp > maxTemp) {
// Если текущая температура превышает максимальную, установите предупреждение
display.println(F("JOPA!"));
display.display();
tone(buzzerPin, 3000, 6000); // Включаем пищалку с частотой 3000 Гц на 6000 мс
} else {
display.println(F("NORM"));
display.display();
}
// Задержка для стабилизации температуры
delay(1000);
}