Ошибка при компиляции.

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

toxikaciya пишет:

Может быть так в 43 строке:

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

Либо сделать два if-а с проверкой состояния пина.

можно так, снимаем ногодрыг на включение если уже включено

Тогда получается реле постоянно включено хоть при низком хоть при высоком всегда состояния включено.

Lachin
Offline
Зарегистрирован: 02.10.2016

Оставил пока вот так,но есть одна проблема,как сделать задержку включения реле на 5-7 минут,например стабилизировалось, напряжение 220-225в и через 5-7 минут включаем реле,как сделать правильно ? 

 

//  26/04/2017

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0; //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0; //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0; // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
}

void bipers() {

  tone (p, 3000); //включаем на 3000 Гц
  delay(150); //ждем 200 Мс
  noTone(p ); // отключаем

}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);


  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

ua6em пишет:

toxikaciya пишет:

Может быть так в 43 строке:

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

Либо сделать два if-а с проверкой состояния пина.

можно так, снимаем ногодрыг на включение если уже включено

Тогда получается реле постоянно включено хоть при низком хоть при высоком всегда состояния включено.

Это называется за что боролись на то и напоролись, реле то реверсное ))), вот так пробуй
 

if ( digitalRead(RelePin)==ReleON && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

Оставил пока вот так,но есть одна проблема,как сделать задержку включения реле на 5-7 минут,например стабилизировалось, напряжение 220-225в и через 5-7 минут включаем реле,как сделать правильно ? 

 

//  26/04/2017

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0; //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0; //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0; // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
}

void bipers() {

  tone (p, 3000); //включаем на 3000 Гц
  delay(150); //ждем 200 Мс
  noTone(p ); // отключаем

}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);


  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 


поставь константу не 10 секунд, а 5-7 минут, в чём проблема?
Но за это время входное напряжение не должно улетать за пределы напряжения включения, иначе при каждом улёте счетчик сбрасывается

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

ua6em пишет:

toxikaciya пишет:

Может быть так в 43 строке:

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

Либо сделать два if-а с проверкой состояния пина.

можно так, снимаем ногодрыг на включение если уже включено

Тогда получается реле постоянно включено хоть при низком хоть при высоком всегда состояния включено.

Это называется за что боролись на то и напоролись, реле то реверсное ))), вот так пробуй
 

if ( digitalRead(RelePin)==ReleON && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

 

 

Это понятно,но я менял уже и так и этак,и сейчас тоже самое все равно реле включено. 

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

Оставил пока вот так,но есть одна проблема,как сделать задержку включения реле на 5-7 минут,например стабилизировалось, напряжение 220-225в и через 5-7 минут включаем реле,как сделать правильно ? 

 

//  26/04/2017

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0; //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0; //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0; // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
}

void bipers() {

  tone (p, 3000); //включаем на 3000 Гц
  delay(150); //ждем 200 Мс
  noTone(p ); // отключаем

}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);


  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 


поставь константу не 10 секунд, а 5-7 минут, в чём проблема?
Но за это время входное напряжение не должно улетать за пределы напряжения включения, иначе при каждом улёте счетчик сбрасывается

 

Во тут ставил по разному но не как не получается сделать 5-7 минут

unsigned int T1 = 10000;  // время задержки реле включения

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

ua6em пишет:

Lachin пишет:

Оставил пока вот так,но есть одна проблема,как сделать задержку включения реле на 5-7 минут,например стабилизировалось, напряжение 220-225в и через 5-7 минут включаем реле,как сделать правильно ? 

 

//  26/04/2017

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0; //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0; //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0; // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
}

void bipers() {

  tone (p, 3000); //включаем на 3000 Гц
  delay(150); //ждем 200 Мс
  noTone(p ); // отключаем

}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);


  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 


поставь константу не 10 секунд, а 5-7 минут, в чём проблема?
Но за это время входное напряжение не должно улетать за пределы напряжения включения, иначе при каждом улёте счетчик сбрасывается

 

Во тут ставил по разному но не как не получается сделать 5-7 минут

unsigned int T1 = 10000;  // время задержки реле включения

 

поставь 300000;

Оставь пока с ногодрыгом

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

ua6em пишет:

Lachin пишет:

Оставил пока вот так,но есть одна проблема,как сделать задержку включения реле на 5-7 минут,например стабилизировалось, напряжение 220-225в и через 5-7 минут включаем реле,как сделать правильно ? 

 

//  26/04/2017

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0; //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0; //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0; // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
}

void bipers() {

  tone (p, 3000); //включаем на 3000 Гц
  delay(150); //ждем 200 Мс
  noTone(p ); // отключаем

}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);


  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 


поставь константу не 10 секунд, а 5-7 минут, в чём проблема?
Но за это время входное напряжение не должно улетать за пределы напряжения включения, иначе при каждом улёте счетчик сбрасывается

 

Во тут ставил по разному но не как не получается сделать 5-7 минут

unsigned int T1 = 10000;  // время задержки реле включения

 

поставь 300000;

Оставь пока с ногодрыгом

Так и делал но все равно больше одной минуты не получается.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

ua6em пишет:

Lachin пишет:

ua6em пишет:

Lachin пишет:

Оставил пока вот так,но есть одна проблема,как сделать задержку включения реле на 5-7 минут,например стабилизировалось, напряжение 220-225в и через 5-7 минут включаем реле,как сделать правильно ? 

 

//  26/04/2017

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0; //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0; //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0; // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
}

void bipers() {

  tone (p, 3000); //включаем на 3000 Гц
  delay(150); //ждем 200 Мс
  noTone(p ); // отключаем

}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);


  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 


поставь константу не 10 секунд, а 5-7 минут, в чём проблема?
Но за это время входное напряжение не должно улетать за пределы напряжения включения, иначе при каждом улёте счетчик сбрасывается

 

Во тут ставил по разному но не как не получается сделать 5-7 минут

unsigned int T1 = 10000;  // время задержки реле включения

 

поставь 300000;

Оставь пока с ногодрыгом

Так и делал но все равно больше одной минуты не получается.

Какой-то ты Камал переменчивый, то тебе 20 секунд, то 5-7 минут, ты уж определись )))
так должно быть так:
 

unsigned long T1 = 300000;  // время задержки реле включения

 

Lachin
Offline
Зарегистрирован: 02.10.2016

Вот на данный момент код выглядит вот так.

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  
}

void bipers() {
  tone (bipers, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(bipers ); // отключаем
}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper
    
  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Измени строку 7, переменная int беззнаковая считает только до 65535
А книжки надо читать, начать хотя бы с переменных )))

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Измени строку 7, переменная int беззнаковая считает только до 65535
А книжки надо читать, начать хотя бы с переменных )))

Получается так.

int T1 = 300000;

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

ua6em пишет:

Измени строку 7, переменная int беззнаковая считает только до 65535
А книжки надо читать, начать хотя бы с переменных )))

Получается так.

int T1 = 300000;

а надо так
 

unsigned long T1 = 300000;  // время задержки реле включения

 

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

ua6em пишет:

Измени строку 7, переменная int беззнаковая считает только до 65535
А книжки надо читать, начать хотя бы с переменных )))

Получается так.

int T1 = 300000;

а надо так
 

unsigned long T1 = 300000;  // время задержки реле включения

 

 

Да вы просто волшебник,все Ок как надо срабатывает.

Еще одна просьба если можно пожалуйста,хотелось еще пару светодиодов поставить,один светодиод красный другой зеленый,красный если напряжения 250в,а зеленый 170в,получается опустилось до 170в включается зеленый светодиод и следом бузер издает звук,такое возможно если до как можно сделать правильно?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

ua6em пишет:

Lachin пишет:

ua6em пишет:

Измени строку 7, переменная int беззнаковая считает только до 65535
А книжки надо читать, начать хотя бы с переменных )))

Получается так.

int T1 = 300000;

а надо так
 

unsigned long T1 = 300000;  // время задержки реле включения

 

 

Да вы просто волшебник,все Ок как надо срабатывает.

Еще одна просьба если можно пожалуйста,хотелось еще пару светодиодов поставить,один светодиод красный другой зеленый,красный если напряжения 250в,а зеленый 170в,получается опустилось до 170в включается зеленый светодиод и следом бузер издает звук,такое возможно если до как можно сделать правильно?

Весь код, чтобы зажечь оба светодиода в тексте скетча есть, там где разбор напряжения,

попробуйте сами, думаю получится

Я начинающий, почитывающий здесь эту страничку

 

 

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

ua6em пишет:

Lachin пишет:

ua6em пишет:

Измени строку 7, переменная int беззнаковая считает только до 65535
А книжки надо читать, начать хотя бы с переменных )))

Получается так.

int T1 = 300000;

а надо так
 

unsigned long T1 = 300000;  // время задержки реле включения

 

 

Да вы просто волшебник,все Ок как надо срабатывает.

Еще одна просьба если можно пожалуйста,хотелось еще пару светодиодов поставить,один светодиод красный другой зеленый,красный если напряжения 250в,а зеленый 170в,получается опустилось до 170в включается зеленый светодиод и следом бузер издает звук,такое возможно если до как можно сделать правильно?

Я начинающий, почитывающий здесь эту страничку

 

Там читаю тоже,и пытался пристроить пару светодиодов ну не как не получается сделать это сделать правильно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

строка 27, с неё берёте куски, попробуйте, покажите как получается

Lachin
Offline
Зарегистрирован: 02.10.2016

Наверное точно не так.

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 8;
byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

    digitalWrite(led, HIGH);
    delay(200);
    digitalWrite(led, LOW);

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Всё таки сомневаюсь в аппаратной правильности этой конструкции, ГУРУ, просветите, может аппаратно соединить с цифровым входом и считывать состояние будет правильней?

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

" в голове вертится припевочка...ж..па выход, а не вход"

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

конечно, вы бы сначала светодиоды воткнули в пины, а потом писали код, где косяк поняли?

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Всё таки сомневаюсь в аппаратной правильности этой конструкции, ГУРУ, просветите, может аппаратно соединить с цифровым входом и считывать состояние будет правильней?

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

" в голове вертится припевочка...ж..па выход, а не вход"

Но если так сделать то реле постоянно включено что при высоком что при низком что при нормальном напряжении,конечно хотелось бы по нормальному а не через ж..п. 

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

конечно, вы бы сначала светодиоды воткнули в пины, а потом писали код, где косяк поняли?

Светодиоды не ставил еще а просто пока написал что бы вы глянули верно или нет,а где мой косяк я не понял если честно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

ua6em пишет:

Всё таки сомневаюсь в аппаратной правильности этой конструкции, ГУРУ, просветите, может аппаратно соединить с цифровым входом и считывать состояние будет правильней?

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

" в голове вертится припевочка...ж..па выход, а не вход"

Но если так сделать то реле постоянно включено что при высоком что при низком что при нормальном напряжении,конечно хотелось бы по нормальному а не через ж..п. 

идеологически всё правильно, там аппаратная проблема я думаю нарисовалась, вы сюда не лезте, может народ подскажет, ну или выход на реле соединить с 6 пином и его прописать, 100% должно работать

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

ua6em пишет:

Всё таки сомневаюсь в аппаратной правильности этой конструкции, ГУРУ, просветите, может аппаратно соединить с цифровым входом и считывать состояние будет правильней?

if ( digitalRead(RelePin)==ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);

" в голове вертится припевочка...ж..па выход, а не вход"

Но если так сделать то реле постоянно включено что при высоком что при низком что при нормальном напряжении,конечно хотелось бы по нормальному а не через ж..п. 

идеологически всё правильно, там аппаратная проблема я думаю нарисовалась, вы сюда не лезте, может народ подскажет, ну или выход на реле соединить с 6 пином и его прописать, 100% должно работать

Ок подождем народ .

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Надо проверить, ногу 11 соединить с ногой 12
 

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 6;

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode)SysPin, INPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

    digitalWrite(led, HIGH);
    delay(200);
    digitalWrite(led, LOW);

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (digitalRead(SysPin)==ReleOFF &&Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Надо проверить, ногу 11 соединить с ногой 12
 

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 6;

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode)SysPin, INPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper

    digitalWrite(led, HIGH);
    delay(200);
    digitalWrite(led, LOW);

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (digitalRead(SysPin)==ReleOFF &&Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

Ок сейчас проверю.

Lachin
Offline
Зарегистрирован: 02.10.2016

Соединил 11 ногу с 12,залил этот код,вот только я не пойму что должно было изменится? вроде также,то есть понизил до 170в отключилось реле,поднял до 220в включилось реле,и также с повысил до 250в отключилось реле потом выставил 220в включилось реле.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

Соединил 11 ногу с 12,залил этот код,вот только я не пойму что должно было изменится? вроде также,то есть понизил до 170в отключилось реле,поднял до 220в включилось реле,и также с повысил до 250в отключилось реле потом выставил 220в включилось реле.

Значит всё ШИКАРНО, ногодрыг одолели )))

Lachin
Offline
Зарегистрирован: 02.10.2016

Я же не зря написал что вы волшебник,а вот как быть со светодиодами? 

Подключил два светодиода на 6 и 7 пин,но моргает один в место двух,то есть что при 250в моргает один что при 170в моргает тот же светодиод.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а условие зажигания светодиода в поправленном мной скетче в 39 строке кто писать будет?
ну ловите, пищать будет при высоком напряжении высоким тоном
 

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 6;

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(SysPin, INPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

void bipers2() {
  tone (b, 5000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
   
      if (sensorValue <= 330){
      digitalWrite(led, HIGH);
      bipers(); // Если напряжение не в норме то сработал biper
      digitalWrite(led, LOW);
     }
     if (sensorValue >= 470){
      digitalWrite(ledX, HIGH);
      bipers2(); // Если напряжение не в норме то сработал biper
      digitalWrite(ledX, LOW);
     }

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }


  if (digitalRead(SysPin)==ReleOFF &&Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

Lachin
Offline
Зарегистрирован: 02.10.2016

Что не так,сразу горят два светодиода.

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 2;

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned int T1 = 10000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(SysPin, INPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}
void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330) digitalWrite(ledX, HIGH);

  if (sensorValue >= 470)
    digitalWrite(ledX, HIGH);

  digitalWrite(ledX, HIGH);
  digitalWrite(led, HIGH);


  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
    bipers(); // Если напряжение не в норме то сработал biper


  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;

    }
  }


  if (digitalRead(SysPin) == ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а что им не горить, если ты их не тушишь, мой код выше, проверь

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Нифига себе вы настрочили :)

Внесу свою лепту

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int beeper = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledGreen = 7;
int ledRed = 8;
boolean Vin_OK = false;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
boolean Flag_T1 = false;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

byte ReleON = 0;  // реле включено
byte ReleOFF = 1; // реле выключено

void setup()
{
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(ledGreen, OUTPUT); //зеленый
  pinMode(ledRed, OUTPUT); //красный

}

void bipers()
{
  tone (beeper, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(beeper); // отключаем
}
void loop()
{
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 && Vin_OK == true)   //тут делаем сравнение если в сети 170в (335) то сбрасываем флаг
  {
    Vin_OK = false;
    Flag_T1 = false;
    bipers(); // Если напряжение не в норме то сработал biper
    digitalWrite(ledGreen, HIGH);
  }

  if (sensorValue >= 470 && Vin_OK == true)   //тут делаем сравнение если в сети 250в (483) то сбрасываем флаг
  {
    Vin_OK = false;
    Flag_T1 = false;
    bipers(); // Если напряжение не в норме то сработал biper
    digitalWrite(ledRed, HIGH);
  }

  if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = true;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = true;
    }
  }


  if (digitalRead(RelePin) == ReleOFF && Vin_OK == true && Flag_T1 == true && (millis() - previousMillis) >= T1)
  {
    digitalWrite(RelePin, ReleON);  //включение реле после задержки
    digitalWrite(ledGreen, LOW);    //выключение светодиодов
    digitalWrite(ledRed, LOW);
  }
  if (digitalRead(RelePin) == ReleON && Vin_OK == false)
  {
    digitalWrite(RelePin, ReleOFF);
  }

  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

существует 99 способов, 100 профессор, 100, первый - лёжа, тогда 101 )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да кстати, это не рабочая конструкция, петля получается, считывать надо другим цифровым пином настроенным на вход

 if (digitalRead(RelePin) == ReleOFF && Vin_OK == true && Flag_T1 == true && (millis() - previousMillis) >= T1)

реализовали так

 if (digitalRead(SysPin)==ReleOFF &&Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1)

 

Lachin
Offline
Зарегистрирован: 02.10.2016
ua6em спасибо вам огромное вы молодец вы все гениально четко сделали,и довели этот код до того что мне нужно было,все что надо все есть,задержки светодиоды бузер ,и самое главное все это работает как положено,я вам очень благодарен за оказанную мне вами помощь,сам бы реально месяц делал все это с вами за пару дней все решилось,по больше таких людей отзывчивых и добрых без всяких лишних слов,низки вам поклон.
 
Осталось самое малое, подобрать нужный контроллер что бы ардуинку не ставить,вытравить платку все это дело скомпоновать еще раз проверить подправить значения,это самое мало что осталось по сравнению с кодом.Возможно еще придется чуть подправить схему измерения.
 
(toxikaciya)  (Araris) вам тоже спасибо что мимо не прошли. 
 
toxikaciya
Offline
Зарегистрирован: 11.04.2016

to ua6em: Вот оно как. А казалось бы должно работать.

Lachin
Offline
Зарегистрирован: 02.10.2016

toxikaciya пишет:

Вот оно как. А казалось бы должно работать.

Ваш код проверил,получается так,если например понизили напряжения бузер пик потом загорелся светодиод, потом поднимаю до 220в светодиод продолжает гореть,то есть не так как нужно,вот то что помог написать мне ua6em там работает иначе,понизил например до 170в сработал бузер пик пик пик  и моргает светодиод,потом поднимаю до 220в бузер молчит и светодиод тоже не горит потом ждем 5 минут и включается реле.

Lachin
Offline
Зарегистрирован: 02.10.2016

Ребята хотел еще один вопрос задать,в какую Атмегу можно залить этот код,вот стакими размерами.Думал может Атмега48?

Скетч использует 4080 байт (12%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 215 байт (10%) динамической памяти, оставляя 1833 байт для локальных переменных. Максимум: 2048 байт.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Lachin пишет:

Ребята хотел еще один вопрос задать,в какую Атмегу можно залить этот код,вот стакими размерами.Думал может Атмега48?

Скетч использует 4080 байт (12%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 215 байт (10%) динамической памяти, оставляя 1833 байт для локальных переменных. Максимум: 2048 байт.

Я бы использовал атмегу nano, или 168, дешевле не получится и травить ничего не надо )))
Выкладываю чуть поправленный код, не проверял, но должно работать так же!
В коде комментарии, зачем так делается )))
 

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 6;

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

// byte ReleON = 0;  // реле включено
// byte ReleOFF = 1; // реле выключено

/* следующая ниже конструкция по идее должна бы высвободить 2 байта памяти занятые под переменные
 * и будет более правильной, так как использует команды препроцессора и по сути является макросом
 * заменяя в нужных местах слова на цифровые значения
 * при использовании реле с прямой логикой просто заменить 0 на 1, а 1 на ноль
 */
#define ReleON  0  // реле включено
#define ReleOFF 1  // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(SysPin, INPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

void bipers2() {
  tone (b, 5000); //включаем на 5000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
   
      if (sensorValue <= 330){
      digitalWrite(led, HIGH);
      bipers(); // Если напряжение не в норме то сработал biper
      digitalWrite(led, LOW);
     }
     if (sensorValue >= 470){
      digitalWrite(ledX, HIGH);
      bipers2(); // Если напряжение не в норме то сработал biper2 
      digitalWrite(ledX, LOW);
     }

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }

// командами digitalRead(SysPin)==ReleOFF и digitalRead(SysPin)==ReleON избавляемся от повторной установки (НОГОДРЫГ)
// состояния реле, если уже установлено, надо ли это делать можно посмотреть осциллографом
// или триггером ловушкой оценить состояние пина в установившемся состоянии реле

  if (digitalRead(SysPin) == ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (digitalRead(SysPin) == ReleON && Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

toxikaciya пишет:

to ua6em: Вот оно как. А казалось бы должно работать.

я выше съёрничал, насчёт того, что выход не может быть входом )))
оно можно было бы но аппаратно должно быть два блока логики и семафоры от внутренней петли

Lachin
Offline
Зарегистрирован: 02.10.2016

ua6em пишет:

Lachin пишет:

Ребята хотел еще один вопрос задать,в какую Атмегу можно залить этот код,вот стакими размерами.Думал может Атмега48?

Скетч использует 4080 байт (12%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 215 байт (10%) динамической памяти, оставляя 1833 байт для локальных переменных. Максимум: 2048 байт.

Я бы использовал атмегу nano, или 168, дешевле не получится и травить ничего не надо )))
Выкладываю чуть поправленный код, не проверял, но должно работать так же!
В коде комментарии, зачем так делается )))
 

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
int sensorValue = 0; //с чего мерим напряжения в сети
int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int ledX = 7;
int led = 6;

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

// byte ReleON = 0;  // реле включено
// byte ReleOFF = 1; // реле выключено

/* следующая ниже конструкция по идее должна бы высвободить 2 байта памяти занятые под переменные
 * и будет более правильной, так как использует команды препроцессора и по сути является макросом
 * заменяя в нужных местах слова на цифровые значения
 * при использовании реле с прямой логикой просто заменить 0 на 1, а 1 на ноль
 */
#define ReleON  0  // реле включено
#define ReleOFF 1  // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(SysPin, INPUT);
  pinMode(ledX, OUTPUT); //LedX
  pinMode(led, OUTPUT); //Led

}

void bipers() {
  tone (b, 3000); //включаем на 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

void bipers2() {
  tone (b, 5000); //включаем на 5000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

void loop() {
  sensorValue = analogRead(sensorPin);

  if (sensorValue <= 330 || sensorValue >= 470) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
   
      if (sensorValue <= 330){
      digitalWrite(led, HIGH);
      bipers(); // Если напряжение не в норме то сработал biper
      digitalWrite(led, LOW);
     }
     if (sensorValue >= 470){
      digitalWrite(ledX, HIGH);
      bipers2(); // Если напряжение не в норме то сработал biper2 
      digitalWrite(ledX, LOW);
     }

  }

  else if (sensorValue >= 400 && sensorValue <= 413) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }

// командами digitalRead(SysPin)==ReleOFF и digitalRead(SysPin)==ReleON избавляемся от повторной установки (НОГОДРЫГ)
// состояния реле, если уже установлено, надо ли это делать можно посмотреть осциллографом
// или триггером ловушкой оценить состояние пина в установившемся состоянии реле

  if (digitalRead(SysPin) == ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (digitalRead(SysPin) == ReleON && Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);



  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

поправил скетч, добавил возможность применения цифрового фильтра первого порядка для данных сенсора:

 

int sensorPin = A0; // аналоговый вход
int RelePin = 12;  // управление реле на 12 пине
int SysPin = 11;  // это пин соединить с 12, цифровой вход, защита от ногодрыга
unsigned int sensorValue = 0; // переменная напряжения сенсора
static unsigned long G;       // Переменная для накопления показаний датчика сенсора

int b = 8;  //объявляем переменную с номером пина, на который подключен biper
int Pin_Vmin_led = 7;
int Pin_Vmax_led = 6;
int Pin_V_ok_led = 5;
int V_min = 330;      // коэффициент для минимального напряжения
int V_max = 470;      // коэффициент для максимального напряжения
int V_gist = 10;      // гистерезис, без цифровой обработки значения входящего напряжения не может быть менее 7
                      // если будем использовать цифровой фильтр, то можно уменьшить, предположительно до значения 3

byte Vin_OK = 0;  //эта переменная служит для проверки входного напряжение, входит ли оно в наши установки, если входит, то 1, нет 0
byte Flag_T1 = 0;  //этот флаг информирует,что было зафиксировано правильное входное напряжение и запущен счетчик выдержки паузы на включение реле
unsigned long T1 = 300000;  // время задержки реле включения
unsigned long previousMillis = 0;

/* следующая ниже конструкция по идее должна бы высвободить 2 байта памяти занятые под переменные
 * и будет более правильной, так как использует команды препроцессора и по сути является макросом
 * заменяя в нужных местах слова на цифровые значения
 * при использовании реле с прямой логикой просто заменить 0 на 1, а 1 на ноль
 */
#define ReleON  0  // реле включено
#define ReleOFF 1  // реле выключено

void setup() {
  Serial.begin(9600); // скорость порта
  pinMode(RelePin, OUTPUT);
  pinMode(SysPin, INPUT);
  pinMode(Pin_Vmin_led, OUTPUT); // заниженное напряжение
  pinMode(Pin_Vmax_led, OUTPUT); // завышенное напряжение
  pinMode(Pin_V_ok_led, OUTPUT); // напряжение в норме
}

/* высокий тон высокачая частота мигания светодиода - напряжение завышено */
void bipers() {
  tone (b, 3000); //включаем тон 3000 Гц
  delay(200); //ждем 200 Мс
  noTone(b ); // отключаем
}

/* высокий тон высокачая частота мигания светодиода - напряжение завышено */
void bipers2() {
  tone (b, 7000); //включаем тон 7000 Гц
  delay(73); //ждем 73 Мс
  noTone(b ); // отключаем
}

void read_sensor(){
  for (int j=1; j <= 8; j++) {
   sensorValue = analogRead(sensorPin);
   G+=sensorValue-(G>>8);
   sensorValue=G>>8;                      // показания сенсора после цифрового фильтра
}
  }
  
void loop() {
 // sensorValue = analogRead(sensorPin);  // раскомментировать, если не используем цифровой фильтр
  read_sensor();                          // закомментировать, если не используем цифровой фильтр

  if (sensorValue <= V_min || sensorValue >= V_max) {  //тут делаем сравнение двух значении если в сети 170в (335) или 250в (483) то сбрасываем флаг
    Vin_OK = 0;
    Flag_T1 = 0;
   
      if (sensorValue <= V_min){
      digitalWrite(Pin_Vmin_led, HIGH);
      bipers(); // Если напряжение не в норме то сработал biper
      digitalWrite(Pin_Vmin_led, LOW);
     }
     if (sensorValue >= V_max){
      digitalWrite(Pin_Vmax_led, HIGH);
      bipers2(); // Если напряжение не в норме то сработал biper 
      digitalWrite(Pin_Vmax_led, LOW);
     }

  }

  else if (sensorValue > (V_min + V_gist) && sensorValue < (V_max - V_gist)) {  // тут делаем период включения между 172в (412) и 220в (425),и между 250в и 225в
    Vin_OK = 1;
    if (Flag_T1 == 0) {
      previousMillis = millis();  //реле задержки включения
      Flag_T1 = 1;
    }
  }

// командами digitalRead(SysPin)==ReleOFF и digitalRead(SysPin)==ReleON избавляемся от повторной установки (НОГОДРЫГ)
// состояния реле, если уже установлено, надо ли это делать можно посмотреть осциллографом
// или триггером ловушкой оценить состояние пина в установившемся состоянии реле

  if (digitalRead(SysPin) == ReleOFF && Vin_OK == 1 && Flag_T1 == 1 && (millis() - previousMillis) >= T1) digitalWrite(RelePin, ReleON);
  else if (digitalRead(SysPin) == ReleON && Vin_OK == 0) digitalWrite(RelePin, ReleOFF);   //else digitalWrite(RelePin, ReleOFF);

  if(digitalRead(SysPin) == ReleON){digitalWrite(Pin_V_ok_led, HIGH);}
  else {digitalWrite(Pin_V_ok_led, LOW);}

  Serial.println(sensorValue); // выводим информацию в сериал порт

  delay(100);
}

 

Lachin
Offline
Зарегистрирован: 02.10.2016
Окончательно запутался,как же мне теперь сделать  что бы отключалось при низком например при 180в и что бы при высоком скажем 250в?а включатся будет при каком? как с этим гистерезисом теперь работать.
 
Например сейчас на латаре выставил 250в в мониторе порта у меня такие данные приходят это при 250в,да и странновато как то работает этот код,например скажем сейчас я выставил 250в потом запускаю монитор порта что бы посмотреть значения что приходит туда в момент когда запустил монитор порта на мгновения включается отключается реле и потом  срабатывает светодиод тот что показывает низкое напряжения и работает бузер и через 10секунд отключается светодиод и сам бузер. Вот что в мониторе порта приходит при 250в.Это при тех условиях что я описал.
 
На данный момент мне надо сделать например при низком напряжении отключения 180в и включения 200в,а при высоком отключения 250в и включения 230в.
 
Получается мне надо между этими значениями.
int V_min = 333; // вот так получается отключается при 169в и включается при 198в
int V_max = 470; // вот тут получается отключается при 253в и включается при 234в

А сам гистерезис вот такой как и был. 

int V_gist = 10;

Вопрос как мне сделать что бы было 180в-200в и 250-230в,как мне выловить нужные значения? при вот таких значениях.

14
28
42
56
69
81
93
105
117
128
139
149
159
169
178
187
196
205
213
222
229
237
244
252
258
265
272
278
284
290
296
301
307
312
317
322
326
331
336
340
344
348
352
356
360
363
367
370
373
377
380
383
385
388
391
394
396
399
401
403
406
408
410
412
414
416
418
420
421
423
425
426
428
429
431
432
434
435
436
437
439
440
441
442
443
444
445
446
447
448
449
450
451
452
452
453
454
454
455
456
457
457
458
458
459
459
460
460
461
461
462
462
463
463
464
464
464
465
465
466
466
466
467
467
467
467
468
468
468
469
469
469
469
470
470
470
470
471
471
471
471
472
472
473
473
474
474
474
474
474
474
474
474
474
474
474
475
475
475
475
475
475
475
475
475
475
475
475
475
475
475
475
475
475
475
475
474
474
474
474
474
474
474
474
474
 
Вот что то примерное такое хотелось сделать как по этим ссылкам.  
 
 
 
 
 
 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

цифровой фильтр позволяет увидеть в мониторе значение при нужном нам напряжении, выставляем напряжение и смотрим, пока в мониторе порта не пойдут стабильные показания
По разнице определим гистерезис
Далее выключить цифровой фильтр и включить прямое считывание с сенсора

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А вообще это неправильный подход, правильный применён в изделиях SURGE ARREST - срезание полуволны до выставленного напряжения и рассеивание этой мощности на мощных резисторах, далее, при нагреве резисторов до определённой температуры срабатывание защиты отключающей электропитание

Lachin
Offline
Зарегистрирован: 02.10.2016

Хорошо,тогда мне надо сейчас считать значения при цыфровом ,потом отключаю цыфровой и включаю прямое считывание с сенсора ?и потом все эти данные сюда,при высоком то есть 250в 230в,и при низком 180в и 200в,я верно понял вас ?

Lachin
Offline
Зарегистрирован: 02.10.2016

Я вам на почту скинул все значения и показания,сюда не как не могу выложить архив.

Еще один вопрос,не понятно при каком тогда напряжении будет включатся реле? 

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Судя по картинкам цифровой фильтр здеь не применим и минимальный гистерезис должен быть 12 единиц

включение регулируется в этой строке
 

  else if (sensorValue > (V_min + V_gist) && sensorValue < (V_max - V_gist)) {  // тут делаем 

 

Lachin
Offline
Зарегистрирован: 02.10.2016

Получается то что выше код про него можно забыть?

 

То етсь тут ставим 12?

int V_gist = 12;

А тут каким оброзом сделать мне нужные значения на включения?

else if (sensorValue > (V_min + V_gist) && sensorValue < (V_max - V_gist)) {  // тут делаем

Тут выставил так.

int V_min = 356; // коэффициент для минимального напряжения
int V_max = 463; // коэффициент для максимального напряжения
int V_gist = 12; // гистерезис, без цифровой обработки значения входящего напряжения не может быть менее 7