Advertisement
Guest User

ControlRPIArduino

a guest
Jun 25th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.51 KB | None | 0 0
  1. #include <avr/wdt.h>
  2. #include <MsTimer2.h>
  3.  
  4. volatile unsigned int countPulseRPI = 0;            // счётчик импульсов RPI
  5. volatile int key_1_On = 0;                          // активация выбранного ключа на 1 сек
  6. volatile int key_3_On = 0;                          // активация выбранного ключа на 3 сек
  7. int setPeriodTimer = 100;                           // время прерывания по таймеру2 в ms
  8. volatile byte rpiNotRun = 0;                        // RPI не в работе
  9. volatile int countKey = 0;                          // счётчик длительности активации ключа
  10. volatile unsigned int countTimer2 = 0;              // счётчик срабатываний таймера2
  11. volatile float bat_1 = 0;                           // напряжение на аккумуляторе
  12. volatile byte counRestartRPI = 0;                   // была попытка перезагрузки RPI
  13.  
  14. void pulseRPI() {                   // обработчик прерывания тактовых импульсов от RPI
  15.   countPulseRPI = 0;
  16. }
  17.  
  18. void timer2RunNow() {                // обработчик прерывания таймера 2
  19.   countPulseRPI++;
  20.   countTimer2++;
  21.   if(countPulseRPI > 1200) {                          // если 2 мин. нету импульсов от RPI
  22.     rpiNotRun = 1;                                    // RPI не в работе
  23.   }
  24.   if(!(countTimer2 % 30)) {                           // каждые 3 сек.
  25.     bat_1 = voltageRead(A0);                          // измерение напряжения на аккумуляторе
  26.   }
  27.  
  28.   if(!digitalRead(2) && digitalRead(4)) {             // если нет напряжения до UPS и есть после
  29.     if(rpiNotRun) {                                   // если RPI не работает
  30.       if(!key_1_On && !key_3_On) {                    // если ни один ключ не активен
  31.         key_3_On = 3;                                 // выключаем UPS
  32.       }
  33.     }
  34.     else {                                            // если RPI работает
  35.       if(bat_1 < 3.75) {                              // если аккумулятор разряжен
  36.         if(!key_1_On && !key_3_On) {                  // если ни один ключ не активен
  37.           key_1_On = 2;                               // даём команду завершения работы RPI
  38.         }
  39.       }
  40.     }
  41.   }
  42.   if(digitalRead(2) && !digitalRead(4)) {             // если есть напряжение до UPS и нету после
  43.     if(bat_1 > 3.9) {                                 // если аккумулятор сильно не разряжен
  44.       if(!key_1_On && !key_3_On) {                    // если ни один ключ не активен
  45.         key_1_On = 3;                                 // даём команду включения UPS
  46.       }
  47.     }
  48.   }
  49.   if(digitalRead(2) && digitalRead(4)) {              // если есть напряжение до UPS и есть после
  50.     if(rpiNotRun) {                                   // если RPI не работает
  51.       if(!key_1_On && !key_3_On) {                    // если ни один ключ не активен
  52.         if(!counRestartRPI) {                         // если попытки перезагрузки ещё не было
  53.           counRestartRPI = HIGH;                      // запоминаем попытку перезагрузки RPI
  54.           key_1_On = 1;                               // перезагружаем RPI
  55.         }
  56.       }
  57.     }
  58.     else {
  59.       counRestartRPI = LOW;
  60.     }
  61.   }
  62.   if(key_1_On) {                                      // включение выбранного ключа на 1 сек.
  63.     activateKey(key_1_On, 10);
  64.   }
  65.   if(key_3_On) {                                      // включение выбранного ключа на 3 сек.
  66.     activateKey(key_3_On, 30);
  67.   }
  68. }
  69.  
  70. void setup() {
  71.   wdt_disable();                    // выключаем сторожевой таймер
  72.   Serial.begin(9600);
  73.   analogReference(EXTERNAL);        // устанавливаем внешнее опорное напряжение для АЦП 2.5В
  74.  
  75.   pinMode(2, INPUT);                // напряжение перед UPS
  76.   pinMode(3, INPUT);                // тактовые импульсы от RPI
  77.   pinMode(4, INPUT);                // напряжение за UPS
  78.   pinMode(6, OUTPUT);               // активация пина RUN на RPI
  79.   pinMode(7, OUTPUT);               // активация завершения работы на RPI
  80.   pinMode(8, OUTPUT);               // активация кнопки ON/OFF UPS
  81.   // pin A0                         // напряжение аккумулятора 1
  82.   //************************************************************************************************************
  83.   delay(3000);
  84.   bat_1 = voltageRead(A0);                            // первое измерение напряжения на аккумуляторе
  85.    
  86.   attachInterrupt(1, pulseRPI, RISING);               // прерывание по пину 3
  87.  
  88.   MsTimer2::set(setPeriodTimer, timer2RunNow); // настройка прерывания для регулятора
  89.   MsTimer2::start();                // стартуем прерывание
  90.  
  91.   wdt_enable(WDTO_8S);                                // включаем сторожевой таймер на 8 сек.
  92. }
  93.  
  94. void loop() {
  95.   wdt_reset();                    // сброс сторожевого таймера
  96. }
  97.  
  98. float voltageRead(int bat) {                          // измерение напряжения на аккумуляторе
  99.   int sensorValue = analogRead(bat);
  100.   float voltage = sensorValue * (2.5 / 1023.0);       // пересчёт в вольты
  101.   return voltage;
  102. }
  103.  
  104. void activateKey(int key, int timePress) {            // активация выбранного ключа на заданное время
  105.     if(key == 1){
  106.       digitalWrite(6, HIGH);
  107.     }
  108.     else if(key == 2) {
  109.       digitalWrite(7, HIGH);
  110.     }
  111.     else {
  112.       digitalWrite(8, HIGH);
  113.     }
  114.     countKey++;
  115.     if(countKey > timePress) {
  116.       countKey = 0;
  117.       key_1_On = 0;
  118.       key_3_On = 0;
  119.       digitalWrite(6, LOW);
  120.       digitalWrite(7, LOW);
  121.       digitalWrite(8, LOW);
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement