load controller


Load controller using arduino nano.

This controller is controlled by arduino and triac output. The required power can be powerfully set using two buttons, and the supplied power is displayed on a three-digit seven-segment indicator as a percentage (0 – power is not supplied, 100 – maximum power). This regulator can be used to smoothly control the heating of heaters (for moonshine stills, that’s it).

Link to GitHub

Program code for 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();
  }
}

Simister acts as a dimmer. All libraries were written by me personally, with the exception of two libraries from Alex Gyver. Libraries written by me can be copied into the main program. I wrote them for use in further projects.

The code of the libraries I wrote:

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;   
      }
    }
};

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *