Сторожевой таймер для модема
- Войдите на сайт для отправки комментариев
Пнд, 15/08/2016 - 15:44
Всем привет, подскажите пожалуйста, хочу сделать сторожевой таймер для старого дсл модема, очень часто отваливается интернет на модеме индикатор синхронизации со станцией мигает длинными равными сигналами, и пока по питанию его не жахнешь он не начинает работать. Хочу на индикатор синхронизации сос танцией установиь фоторезистор чтобы он считал колличество этих равных миганий и ребутил модем по питанию, сейчас вроде интервалы считает, но блин не сбрасывает счетчик если модем начал работать.
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);
}
1. Как Вы понимаете условия в строках 34 и 36 (с учётом строки 32). Можете словами сказать, что там по Вашему должно проверяться? Онм (условия) ведь перекрывают друг друга.
2. Эти сравнение (даже если их привести к осмысленному виду) будут иметь хоть какой-то смысл один раз в месяц, когда millis стартует от нуля. Проговорите опять же их словами, чтобы понять, почему. Если нужно отрабатывать азержку, это по другому делается.
светодиод модема при отсутствии связи мигает равными интервалами допустим 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;} }