Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/wdt.h>
- #include <MsTimer2.h>
- volatile unsigned int countPulseRPI = 0; // счётчик импульсов RPI
- volatile int key_1_On = 0; // активация выбранного ключа на 1 сек
- volatile int key_3_On = 0; // активация выбранного ключа на 3 сек
- int setPeriodTimer = 100; // время прерывания по таймеру2 в ms
- volatile byte rpiNotRun = 0; // RPI не в работе
- volatile int countKey = 0; // счётчик длительности активации ключа
- volatile unsigned int countTimer2 = 0; // счётчик срабатываний таймера2
- volatile float bat_1 = 0; // напряжение на аккумуляторе
- volatile byte counRestartRPI = 0; // была попытка перезагрузки RPI
- void pulseRPI() { // обработчик прерывания тактовых импульсов от RPI
- countPulseRPI = 0;
- }
- void timer2RunNow() { // обработчик прерывания таймера 2
- countPulseRPI++;
- countTimer2++;
- if(countPulseRPI > 1200) { // если 2 мин. нету импульсов от RPI
- rpiNotRun = 1; // RPI не в работе
- }
- if(!(countTimer2 % 30)) { // каждые 3 сек.
- bat_1 = voltageRead(A0); // измерение напряжения на аккумуляторе
- }
- if(!digitalRead(2) && digitalRead(4)) { // если нет напряжения до UPS и есть после
- if(rpiNotRun) { // если RPI не работает
- if(!key_1_On && !key_3_On) { // если ни один ключ не активен
- key_3_On = 3; // выключаем UPS
- }
- }
- else { // если RPI работает
- if(bat_1 < 3.75) { // если аккумулятор разряжен
- if(!key_1_On && !key_3_On) { // если ни один ключ не активен
- key_1_On = 2; // даём команду завершения работы RPI
- }
- }
- }
- }
- if(digitalRead(2) && !digitalRead(4)) { // если есть напряжение до UPS и нету после
- if(bat_1 > 3.9) { // если аккумулятор сильно не разряжен
- if(!key_1_On && !key_3_On) { // если ни один ключ не активен
- key_1_On = 3; // даём команду включения UPS
- }
- }
- }
- if(digitalRead(2) && digitalRead(4)) { // если есть напряжение до UPS и есть после
- if(rpiNotRun) { // если RPI не работает
- if(!key_1_On && !key_3_On) { // если ни один ключ не активен
- if(!counRestartRPI) { // если попытки перезагрузки ещё не было
- counRestartRPI = HIGH; // запоминаем попытку перезагрузки RPI
- key_1_On = 1; // перезагружаем RPI
- }
- }
- }
- else {
- counRestartRPI = LOW;
- }
- }
- if(key_1_On) { // включение выбранного ключа на 1 сек.
- activateKey(key_1_On, 10);
- }
- if(key_3_On) { // включение выбранного ключа на 3 сек.
- activateKey(key_3_On, 30);
- }
- }
- void setup() {
- wdt_disable(); // выключаем сторожевой таймер
- Serial.begin(9600);
- analogReference(EXTERNAL); // устанавливаем внешнее опорное напряжение для АЦП 2.5В
- pinMode(2, INPUT); // напряжение перед UPS
- pinMode(3, INPUT); // тактовые импульсы от RPI
- pinMode(4, INPUT); // напряжение за UPS
- pinMode(6, OUTPUT); // активация пина RUN на RPI
- pinMode(7, OUTPUT); // активация завершения работы на RPI
- pinMode(8, OUTPUT); // активация кнопки ON/OFF UPS
- // pin A0 // напряжение аккумулятора 1
- //************************************************************************************************************
- delay(3000);
- bat_1 = voltageRead(A0); // первое измерение напряжения на аккумуляторе
- attachInterrupt(1, pulseRPI, RISING); // прерывание по пину 3
- MsTimer2::set(setPeriodTimer, timer2RunNow); // настройка прерывания для регулятора
- MsTimer2::start(); // стартуем прерывание
- wdt_enable(WDTO_8S); // включаем сторожевой таймер на 8 сек.
- }
- void loop() {
- wdt_reset(); // сброс сторожевого таймера
- }
- float voltageRead(int bat) { // измерение напряжения на аккумуляторе
- int sensorValue = analogRead(bat);
- float voltage = sensorValue * (2.5 / 1023.0); // пересчёт в вольты
- return voltage;
- }
- void activateKey(int key, int timePress) { // активация выбранного ключа на заданное время
- if(key == 1){
- digitalWrite(6, HIGH);
- }
- else if(key == 2) {
- digitalWrite(7, HIGH);
- }
- else {
- digitalWrite(8, HIGH);
- }
- countKey++;
- if(countKey > timePress) {
- countKey = 0;
- key_1_On = 0;
- key_3_On = 0;
- digitalWrite(6, LOW);
- digitalWrite(7, LOW);
- digitalWrite(8, LOW);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement