Сторожевой таймер для модема

primnet
Offline
Зарегистрирован: 08.08.2016
Всем привет, подскажите пожалуйста, хочу сделать сторожевой таймер для старого дсл модема, очень часто отваливается интернет на модеме индикатор синхронизации со станцией мигает длинными равными сигналами, и пока по питанию его не жахнешь он не начинает работать. Хочу на индикатор синхронизации сос танцией установиь фоторезистор чтобы он считал колличество этих равных миганий и ребутил модем по питанию, сейчас вроде интервалы считает, но блин не сбрасывает счетчик если модем начал работать. 
int photocellPin = 5; // фотторезистор считывающий индикатор модема

int photocellReading; // числовая переменная индикатора модема

int rebutMODEM = 9; // пин перезагрузки модема реле или транзисторный ключ

 int signal1 = 0; // сигнал отсутствия связи

 int signalNEUD = 0; // переменная количества неудачных перезагрузок

 unsigned long timer1; // интервал при отсутствии связи

 unsigned long timer2; // интервал при отсутствии связи

void setup(void) {
Serial.begin(9600);
 pinMode (rebutMODEM, OUTPUT); 

}

void loop(void) {

digitalWrite(rebutMODEM, HIGH);

photocellReading = analogRead(photocellPin);

Serial.print("Analog reading = ");

Serial.println(photocellReading); 

    
if (photocellReading > 50 ) {
   timer1 = millis();
   if (photocellReading > 50 && timer1 > 900 &&  timer1 > 1200){
   timer2 = millis();
   if (photocellReading > 50 && timer2 > 900 &&  timer2 > 1200){
   signal1 = signal1 + 1;
   delay(1000);  
     if (signal1 > 10)                //если количество длинных миганий больше 10
     {
       digitalWrite(rebutMODEM, LOW);      
       delay(500);
       digitalWrite(rebutMODEM, HIGH);
       signal1 = 0;                                          
       } 
      }       //если цикл не продолжается то перестаем считать и все сбрасывавем на 0

   }else{
    signal1 = 0;
    }
}
 Serial.print("signal1 = ");
 Serial.println(signal1); 

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Как Вы понимаете условия в строках 34 и 36 (с учётом строки 32). Можете словами сказать, что там по Вашему должно проверяться? Онм (условия) ведь перекрывают друг друга.

2. Эти сравнение (даже если их привести к осмысленному виду) будут иметь хоть какой-то смысл один раз в месяц, когда millis стартует от нуля. Проговорите опять же их словами, чтобы понять, почему. Если нужно отрабатывать азержку, это по другому делается.

primnet
Offline
Зарегистрирован: 08.08.2016

светодиод модема при отсутствии связи мигает  равными интервалами допустим 1 секунда, хочу на этот светодиод установить фоторезистор, в случае если на модеме происходит обрыв связи ардуина считает колличество миганий этого светодиода и если их допустим больше 10 производит холодную перезагрузку модема посредствам релюшки. 

у меня сейчас вроде ардуина считает колличество этих равных миганий, но после того как она один раз перезагрузила модем (колличество равных миганий достигло 10) она начинает выдавать в сериал порт неправельные данные с фоторезистора.

const int photocellPin = 5; // фотторезистор считывающий индикатор модема
int photocellReading; // числовая переменная индикатора модема 
long previousMillis = 0; 
int signal1 = 0;
int signalNEUD = 0;
const int rebutMODEM = 9;
long interval = 2000; 
 
void setup() {
  pinMode(rebutMODEM, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  photocellReading = analogRead(photocellPin);
  unsigned long currentMillis = millis(); // текущее время в миллисекундах
if (analogRead(photocellPin) > 30) {
  if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;
     signal1 = signal1 + 1;
     delay (1000);
     if(signal1>10)                                                               
     {
       digitalWrite(rebutMODEM, LOW);      
       delay(2000);
       digitalWrite(rebutMODEM, HIGH);
       signal1 = 0;                                          
       }
}
}else if  ((currentMillis - previousMillis > interval)&&(analogRead(photocellPin) < 30))
{signal1 = 0;}
}