/*
Измеряем напряжение и выводим на светофор
*/
// -------- НАСТРОЙКИ ---------
#define SETPOINT_Y_G 758 // Зелено-желтая граница (1024 * 3.7 Вольт/5 Вольт=758)
#define SETPOINT_R_Y 300 // Желто - красная граница (1024 * 3.3 Вольт/5 Вольт=675)
#define HYS 10 // Гистерезис
#define INPUT_PIN A0 // Входной аналоговый пин
#define GREEN_PIN 8
#define RED_PIN 9
#define MY_PERIOD 1.5 // частота мигания красного светодиода (Гц)
// ------- БИБЛИОТЕКИ -------
#include <directADC.h>
#include <GyverTimers.h>
// ------- ПЕРЕМЕННЫЕ -------
static bool greenState = false;
static bool redState = false;
int inputSignal;
static bool switchState = false;
uint32_t tmr1; // переменная таймера
// --------- SETUP ----------
void setup() {
Serial.begin(9600);
pinMode(GREEN_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
ADC_disable();
ADC_setPrescaler(128);
setAnalogMux(ADC_A1);
ADC_enable();
}
// ---------- LOOP ----------
void loop() {
//inputSignal = analogRead(INPUT_PIN);
ADC_startConvert();
inputSignal = ADC_readWhenAvailable();
//Serial.println(inputSignal);
// ------Борт готов сдохнуть - мигаем красным
if(inputSignal < SETPOINT_R_Y - HYS) {
Timer1.setFrequency(MY_PERIOD * 2);
Timer1.outputEnable(CHANNEL_A, TOGGLE_PIN);
/*
if (millis() - tmr1 >= MY_PERIOD) { // ищем разницу
tmr1 = millis(); //redState = true;
switch (switchState) {
case 0:
digitalWrite(RED_PIN, true);
digitalWrite(GREEN_PIN, false);
break;
case 1:
digitalWrite(RED_PIN, false);
digitalWrite(GREEN_PIN, false);
break;
}
}
switchState = !switchState;
*/
}
// ------Борт садится - светим красным
else if (inputSignal > SETPOINT_R_Y + HYS && inputSignal < SETPOINT_Y_G - HYS) {
Timer1.stop();
Timer1.outputDisable(CHANNEL_A);
digitalWrite(RED_PIN, true);
digitalWrite(GREEN_PIN, false);
}
// ------Борт заряжен - светим зеленым
else if (inputSignal > SETPOINT_Y_G + HYS) {
Timer1.stop();
Timer1.outputDisable(CHANNEL_A);
digitalWrite(RED_PIN, false);
digitalWrite(GREEN_PIN, true);
}
}