#define DEBUG
//#define DEBUGUSBKEYBOARD
#define RGBLED //вимикати при роботі з ЮСБ
#define RGBLEDDEBUG
#if defined(DEBUGUSBKEYBOARD)
#include <DigiKeyboard.h>
#elif defined(DEBUG)
#include "TinyDebug.h"
#endif
const int relayPin = PB1;
const int analogPin = A1; // A1 = PB2
const int rPin = PB0;
const int gPin = PB3;
const int bPin = PB4;
const int numSamples = 50; // Кількість вибірок для фільтра
int samples[numSamples];
int index;
long sum;
const unsigned long vRef_decV = 5000; // Напруга живлення, мВ
const int adcMax = 1023;
const float dividerK = 11.02;
const int relayMin1 = 13.1 * 1000 / 100;
const int relayMax1 = 14.4 * 1000 / 100;
const int relayMin2 = 26.1 * 1000 / 100;
const int relayMax2 = 28.8 * 1000 / 100;
const int deltaMin = 0.2 * 1000 / 100;
const int deltaMax = 0.2 * 1000 / 100;
const int delayOn = 200;
void setup() {
#if defined(DEBUGUSBKEYBOARD)
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); // Win + R
delay(250);
DigiKeyboard.print("notepad");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
delay(250);
DigiKeyboard.println("\nDEBUG MODE: USB Keyboard active");
#elif defined(DEBUG)
Debug.begin();
#endif
pinMode(analogPin, INPUT);
pinMode(relayPin, OUTPUT);
#if defined(RGBLED)
pinMode(rPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(bPin, OUTPUT);
digitalWrite(relayPin, LOW);
digitalWrite(rPin, LOW);
digitalWrite(gPin, LOW);
digitalWrite(bPin, LOW);
#endif
index = 0;
sum = 0;
for (int i = 0; i < numSamples; i++) {
samples[i] = analogRead(analogPin);
sum += samples[i];
}
}
void loop() {
int raw = analogRead(analogPin);
sum -= samples[index];
samples[index] = raw;
sum += raw;
if (++index >= numSamples) index = 0;
int avgRaw = sum / numSamples;
unsigned long voltage_decV = (unsigned long)avgRaw * vRef_decV * dividerK / adcMax;
#if defined(DEBUGUSBKEYBOARD)
DigiKeyboard.print((unsigned long)raw * vRef_decV * dividerK / adcMax);
DigiKeyboard.print('\t');
DigiKeyboard.println(voltage_decV);
#elif defined(DEBUG)
Debug.print(F("decV"));
Debug.println(voltage_decV);
#endif
if(index == 0){
voltage_decV = (int) voltage_decV / 100;
if (relayMin1 <= voltage_decV && voltage_decV <= relayMax1) {
bool prev = digitalRead(relayPin);
digitalWrite(relayPin, 1);
#if defined(RGBLED)
setLED(1,0,0);
#endif
if(not prev) delay(delayOn);
}
else if (relayMin2 <= voltage_decV && voltage_decV <= relayMax2) {
bool prev = digitalRead(relayPin);
digitalWrite(relayPin, 1);
#if defined(RGBLED)
setLED(0,1,0);
#endif
if(not prev) delay(delayOn);
}
else if (
( 0 < voltage_decV-deltaMin-1 && voltage_decV+deltaMax < relayMin1) ||
( relayMax1 < voltage_decV-deltaMin && voltage_decV+deltaMax < relayMin2) ||
( relayMax2 < voltage_decV+deltaMax)
){
bool prev = digitalRead(relayPin);
digitalWrite(relayPin, 0);
if(prev) delay(delayOn);
#if defined(RGBLED)
setLED(0,0,1);
#endif
}
}
#if defined(DEBUGUSBKEYBOARD)
DigiKeyboard.print(digitalRead(relayPin));
delay(50);
#endif
delay(1);
#if defined(RGBLEDDEBUG)
if (voltage_decV == 70){
setLED(1,1,1);
delay(100);
}
#endif
}
void setLED(bool r, bool g, bool b) {
digitalWrite(rPin, r);
digitalWrite(gPin, g);
digitalWrite(bPin, b);
}Vcc=5V
Датчик напруги
на двох резисторах
(потенціометр для симуляції)