Регулятор нагрузки при помощи arduino nano.
Данный регулятор управляется при помощи arduino и симисторного выхода. Необходимую мощность мощно выставить при помощи двух кнопок, а подаваемая мощность отображается на трехразрядном семисегментном индикаторе в процентах (0 - мощность не подается, 100 - максимальная мощность). Данный регулятор можно использовать для плавного управления нагревом нагревателей (для самогонных аппаратов самое то).

Код программы для arduino:
#include "7segments.h"
#include "MyLib.h"
#include "Buttons.h"
#include <GyverTimers.h>
#include <GyverDimmer.h>
Segmentor segment(5, 6, 7, 8, 9, 10, 11);
unsigned long currentDisplay = 0;
MyRelayOut firstTrans(A7);
MyRelayOut secondTrans(3);
MyRelayOut thirdTrans(4);
Button buttonUp(A0);
Button buttonDown(A1);
const int nullDetector = 2; // детектор нуля
const int simistr = 12;
Dimmer<simistr> dim;
int valuePercent = 0;
void setup() {
attachInterrupt(0, isr, RISING);
Timer2.enableISR();
}
void loop() {
if(buttonUp.click()){valuePercent++;}
if(buttonDown.click()){valuePercent--;}
if(valuePercent < 0){valuePercent = 0;}
else if(valuePercent > 100){valuePercent = 100;}
Display(valuePercent);
dim.write(map(valuePercent, 0, 100, 0, 255));
}
void isr() {
// вызывать в прерывании детектора нуля
// если tickZero() - true - нужно перезапустить таймер с периодом getPeriod()
if (dim.tickZero()) Timer2.setPeriod(dim.getPeriod());
else Timer2.restart();
// иначе перезапустить со старым
}
// прерывание таймера
ISR(TIMER2_A) {
dim.tickTimer(); // вызвать tickTimer()
Timer2.stop(); // останавливаем таймер
}
void Display(int value){
if(millis() - currentDisplay >= 10){
currentDisplay = millis();
int firstNumber = value%10;
int secondNumber = value%100/10;
int thirdNumber = value/100;
firstTrans.on();
segment.chooseNumber(firstNumber);
firstTrans.off();
secondTrans.on();
segment.chooseNumber(secondNumber);
secondTrans.off();
thirdTrans.on();
segment.chooseNumber(thirdNumber);
thirdTrans.off();
}
}
Симистр выступает в роли диммера. Все библиотеки были написаны мной лично за исключением двух библиотек от Alex Gyver. Библиотеки, написанные мной, можно скопировать в основную программу. Написал я их для использования в дальнейших проектах.
Код мной написанных библиотек:
MyLib.h
#pragma once
#include <Arduino.h>
class MyRelayOut{
public:
MyRelayOut(int pin){
pinMode(pin, OUTPUT);
digitalWrite(pin, false);
_pin = pin;
}
void on(){
if(_state){
return;
}
_state = true;
digitalWrite(_pin, _state);
}
void off(){
if(!_state){
return;
}
_state = false;
digitalWrite(_pin, _state);
}
private:
int _pin;
bool _state;
};
class MyRelayIn{
public:
MyRelayIn(int pin){
pinMode(pin, INPUT);
_pin = pin;
}
bool read(){
if(digitalRead(_pin) == LOW){
return false;
}
if(digitalRead(_pin) == HIGH){
return true;
}
}
private:
int _pin;
};
class MyOpticSensor{
public:
MyOpticSensor(int pin){
pinMode(pin, INPUT);
_pin = pin;
}
bool read(){
if(digitalRead(_pin) == LOW){ //если перед датчиком нет препятствий
return true;
}
if(digitalRead(_pin) == HIGH){ // если препятсивя есть
return false;
}
}
private:
int _pin;
};
Buttons.h
#pragma once
#include <Arduino.h>
class Button {
private:
byte _pin;
uint32_t _tmr;
bool _flag;
public:
Button (byte pin) {
_pin = pin;
pinMode(_pin, INPUT_PULLUP);
}
bool click() {
bool btnState = digitalRead(_pin);
if (!btnState && !_flag && millis() - _tmr >= 100) {
_flag = true;
_tmr = millis();
return true;
}
if (!btnState && _flag && millis() - _tmr >= 500) {
_tmr = millis ();
return true;
}
if (btnState && _flag) {
_flag = false;
_tmr = millis();
}
return false;
}
};
7segments
#pragma once
#include <Arduino.h>
class Segmentor{
private:
int _pinA;
int _pinB;
int _pinC;
int _pinD;
int _pinE;
int _pinF;
int _pinG;
public:
Segmentor(int pinA, int pinB, int pinC, int pinD, int pinE, int pinF, int pinG){
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
_pinA = pinA;
_pinB = pinB;
_pinC = pinC;
_pinD = pinD;
_pinE = pinE;
_pinF = pinF;
_pinG = pinG;
}
void one(){
digitalWrite(_pinA, LOW);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, LOW);
digitalWrite(_pinE, LOW);
digitalWrite(_pinF, LOW);
digitalWrite(_pinG, LOW);
}
void two(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, LOW);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, HIGH);
digitalWrite(_pinF, LOW);
digitalWrite(_pinG, HIGH);
}
void three(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, LOW);
digitalWrite(_pinF, LOW);
digitalWrite(_pinG, HIGH);
}
void four(){
digitalWrite(_pinA, LOW);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, LOW);
digitalWrite(_pinE, LOW);
digitalWrite(_pinF, HIGH);
digitalWrite(_pinG, HIGH);
}
void five(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, LOW);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, LOW);
digitalWrite(_pinF, HIGH);
digitalWrite(_pinG, HIGH);
}
void six(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, LOW);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, HIGH);
digitalWrite(_pinF, HIGH);
digitalWrite(_pinG, HIGH);
}
void seven(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, LOW);
digitalWrite(_pinE, LOW);
digitalWrite(_pinF, LOW);
digitalWrite(_pinG, LOW);
}
void eight(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, HIGH);
digitalWrite(_pinF, HIGH);
digitalWrite(_pinG, HIGH);
}
void nine(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, LOW);
digitalWrite(_pinF, HIGH);
digitalWrite(_pinG, HIGH);
}
void zero(){
digitalWrite(_pinA, HIGH);
digitalWrite(_pinB, HIGH);
digitalWrite(_pinC, HIGH);
digitalWrite(_pinD, HIGH);
digitalWrite(_pinE, HIGH);
digitalWrite(_pinF, HIGH);
digitalWrite(_pinG, LOW);
}
void chooseNumber(int k){
switch(k){
case 0:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
};