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

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

Ребята привет,подскажите пожалуйста, при компиляции в 17 строке не пойму в чем дело,если можете гляньте правильно написано,спасибо.

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //измеритель с чего мерим напряжения
int ReleON = 1; //флаг состояния реле

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

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

  if (sensorValue < 380 || sensorValue > 460) //сравнение двух значении если в сети 170в или 250в то сбрасываем флаг
      ReleON == 0;

      if ( ReleON) || (sensorValue > 400 || sensorValue < 470) // вместо 400 ставим  значение при 215в, вместо 470 - при 225в, ВОТ ТУТ ОШИБКА
        ReleON == 1;

        if (!ReleON) digitalWrite(RelePin, HIGH));
      else digitalWrite(RelePin, LOW);


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

  delay(100);
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

if ( ReleON || sensorValue > 400 || sensorValue < 470 )

Условие должно быть в скобках.

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

Araris пишет:

if ( ReleON || sensorValue > 400 || sensorValue < 470 )

Спасибо,но теперь на 20 строке ошибка,если можете проверьте весь код возможно еще есть ошибки,спасибо.

Araris
Offline
Зарегистрирован: 09.11.2012

ReleON = 0; 

ReleON = 1;

Операция присваивания - ОДИН знак "равно".

 

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

Araris пишет:

ReleON = 0; 

ReleON = 1;

Операция присваивания - ОДИН знак "равно".

 

Как правельно сделать? только осваиваю,сеичас на 20 строке .

Araris
Offline
Зарегистрирован: 09.11.2012

if (!ReleON) digitalWrite(RelePin, HIGH);

Количество скобок в выражении считайте.

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

Araris пишет:

if (!ReleON) digitalWrite(RelePin, HIGH);

Количество скобок в выражении считайте.

Спасибо вам все Ок,можно вопрос будет ли этот код работать корректно?  возможно я что то не так написал,сейчас компиляцию прошла,спасибо.

Araris
Offline
Зарегистрирован: 09.11.2012

Словами напишите, при каких условиях ReleON должна быть нулём, и при каких единицей.

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

Araris пишет:

Словами напишите, при каких условиях ReleON должна быть нулём, и при каких единицей.

 

Хочу сделать вольт контроль,при 170в отключаем реле при 250в тоже отключаем реле,как стало в сети 220в то включаем реле.Но нужно еще так что бы сначала была проверка если в сети есть 220-230в то включаем реле,но если в сети 170в или же 250в то не включаем реле,вот я и пытался сделать такое,но что то не как не выходить получить желаемый результат.
 
ReleON  я пытался сделать если в сети 220в то включено реле но если ниже или выше то не включаем реле.
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

что-то перемудрили )))
а состояния когда не 220-225 но еще и не <170 >250???
Есть стандарт (ГОСТ) на напряжение питающей сети, вот в этих рамках и держите реле включенным, за пределами - выключенным,

всего одна строка программы получается

Araris
Offline
Зарегистрирован: 09.11.2012

Lachin пишет:

Хочу сделать вольт контроль,при 170в отключаем реле при 250в тоже отключаем реле,как стало в сети 220в то включаем реле.Но нужно еще так что бы сначала была проверка если в сети есть 220-230в то включаем реле,но если в сети 170в или же 250в то не включаем реле,вот я и пытался сделать такое,но что то не как не выходить получить желаемый результат.

ReleON  я пытался сделать если в сети 220в то включено реле но если ниже или выше то не включаем реле.

Извините, это не похоже на описание алгоритма и мне сложно это понять. Может быть имеется в виду такой алгоритм :

if (sensorValue < 170 || sensorValue > 250) ReleON = 0; // для наглядности значения в Вольтах
else if (sensorValue > 180 && sensorValue < 240) ReleON = 1; // для наглядности значения в Вольтах

Изначально реле включено. В промежутках 170-180В и 240-250В ничего не делаем, учитываем гистерезис.



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

Araris пишет:

Lachin пишет:

Хочу сделать вольт контроль,при 170в отключаем реле при 250в тоже отключаем реле,как стало в сети 220в то включаем реле.Но нужно еще так что бы сначала была проверка если в сети есть 220-230в то включаем реле,но если в сети 170в или же 250в то не включаем реле,вот я и пытался сделать такое,но что то не как не выходить получить желаемый результат.

ReleON  я пытался сделать если в сети 220в то включено реле но если ниже или выше то не включаем реле.

Извините, это не похоже на описание алгоритма и мне сложно это понять. Может быть имеется в виду такой алгоритм :

if (sensorValue < 170 || sensorValue > 250) ReleON = 0; // для наглядности значения в Вольтах
else if (sensorValue > 180 && sensorValue < 240) ReleON = 1; // для наглядности значения в Вольтах

Изначально реле включено. В промежутках 170-180В и 240-250В ничего не делаем, учитываем гистерезис.



 

Да именно так и нужно.

Araris
Offline
Зарегистрирован: 09.11.2012

Исправил == на =

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

Если я правильно понял то так ?

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //измеритель с чего мерим напряжения
int ReleON = 1; //флаг состояния реле

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

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

  if (sensorValue < 340 || sensorValue > 480) ReleON = 0; //сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue > 420 && sensorValue < 440) ReleON = 1; // вместо 400 ставим  значение при 215в, вместо 470 - при 225в


  if (!ReleON) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);


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

  delay(100);
}

 

Если так,то все равно не работает,не при уменьшении напряжения и при повышения напряжения,реле сейчас если выставить 170в все равно включено,если выставить 250в то тоже все равно включено.

Araris
Offline
Зарегистрирован: 09.11.2012

Если там точные значения, то попробуйте заменить < на <= и соответственно > на >=

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

Спасибо вроде получается,но можно спросить если честно не понятно вот это строка с ней чуть не понятно как она работает

else if (sensorValue > 180 && sensorValue < 240) ReleON = 1;
Araris
Offline
Зарегистрирован: 09.11.2012

Просто дословно переводим :

 else     if    sensorValue    >       180  &&  sensorValue    <      240

иначе если sensorValue больше 180   и   sensorValue меньше 240

*Вам бы синтаксис языка почитать, яснее и проще всё станет... 

 

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

Araris пишет:

Просто дословно переводим :

 else     if    sensorValue    >       180  &&  sensorValue    <      240

иначе если sensorValue больше 180   и   sensorValue меньше 240

*Вам бы синтаксис языка почитать, яснее и проще всё станет... 

 

Спасибо вам,все завелось как надо,осталось выставить по точней значения.  

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

Вот сделал так,возможно где то что то не так сделал..

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //измеритель с чего мерим напряжения
int ReleON = 0; //флаг состояния реле

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

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

  if (sensorValue < 327 || sensorValue > 490) ReleON = 0; //сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue > 415 && sensorValue < 435) ReleON = 1; // вместо 400 ставим  значение при 215в, вместо 470 - при 225в


  if (!ReleON) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);


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

  delay(100);
}

 

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

А гистерезис точно нужен? Уж очень маленькое окно на включение

Lachin
Offline
Зарегистрирован: 02.10.2016
Привет,гистерезис желательно нужен,вчера и сегодня выставил нужные значения получилось такое при 250в отключаем реле при 225в включаем реле,при пониженном 170в отключаем реле при 210в включаем реле,не знаю правильно ли я сделал,вот что сейчас залито в ардуино,гляньте пожалуйста возможно где то что то упустил или может что то не так написал,не знаю может я не так в комментариях тоже не правильно описал все,буду благодарен если подправите меня,спасибо. 
 
int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int ReleON = 0; //флаг состояния реле

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

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

  if (sensorValue <= 335 || sensorValue >= 486) ReleON = 0; //тут делаем сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue >= 382 && sensorValue <= 415) ReleON = 1; // тут делаем период включения между  170в и 180в,и между 240в и 250в


  if (!ReleON) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);


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

  delay(100);
}

 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Я в таких случаях читаю строку и проговариваю сам себе "если меньше-равно 335-ти ИЛИ больше-равно 486-ти - сбрасываем", "если больше-равно 382-х И при этом меньше-равно 415-ти - поднимаем". Помогает.

Ещё можно мысленно подставить в условия для всех пяти случаев значения (например 330, 350, 390, 450, 490 ) и мысленно же определить, что будет в пяти случаях с ReleOn. Эдакий дебаггер в голове.

Lachin
Offline
Зарегистрирован: 02.10.2016
Araris спасибо,можно  вашу почту?
 
Можно пару вопросов, 1) как можно добавить в код бузер,например если понизилось напряжения или повысилось что бы выдавал сигнал ти-по такова бип бип  для 170в и бип бип бип для 250в,ну или один общи сигнал что напряжении повысилось или понизилось.
 
2) можно ли сделать как задержки между включением реле то есть скажем упало напряжении до 170в,потом оно поднялось скажем 215-220в и прежде чем включить реле подождать хотя бы 10 секунд для сравнения есть ли там 215-220в,а то может так получится что либо опять упало в этот момент ,и также для повышенного напряжением. Если конечно можно.  
 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в логической правильности этого я сомневаюсь

if (!ReleON) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);

может в лоб сравнивать?

if (ReleON==1) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);
! (логическое отрицание)

True, если операнд false, и наоборот, например:

if (!x) {
  // ...
}

условие верно, если x - false (x равно 0).

Araris
Offline
Зарегистрирован: 09.11.2012

ua6em пишет:

в логической правильности этого я сомневаюсь

if (!ReleON) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);

может в лоб сравнивать?

if (ReleON==1) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);

 

Ой, не запутывайте, человеку и так нелегко. Там, видимо, реле "инвертированное", так что проще всего digitalWrite(RelePin, !ReleON); написать.

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

Использую релейный модуль,ардуино UNO.

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

Lachin пишет:

Araris спасибо,можно  вашу почту?
 
Можно пару вопросов, 1) как можно добавить в код бузер,например если понизилось напряжения или повысилось что бы выдавал сигнал ти-по такова бип бип  для 170в и бип бип бип для 250в,ну или один общи сигнал что напряжении повысилось или понизилось.
 
2) можно ли сделать как задержки между включением реле то есть скажем упало напряжении до 170в,потом оно поднялось скажем 215-220в и прежде чем включить реле подождать хотя бы 10 секунд для сравнения есть ли там 215-220в,а то может так получится что либо опять упало в этот момент ,и также для повышенного напряжением. Если конечно можно.  
 

Я не Araris но на вопрос 1 отвечу, можно )))
 

#include "pitches.h"

// notes in the melody:
int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };

/******************** Бипер ***********************/
void bipers() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 333 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

************ pitches.h***************

/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

 

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

Araris пишет:

ua6em пишет:

в логической правильности этого я сомневаюсь

if (!ReleON) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);

может в лоб сравнивать?

if (ReleON==1) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);

 

Ой, не запутывайте, человеку и так нелегко. Там, видимо, реле "инвертированное", так что проще всего digitalWrite(RelePin, !ReleON); написать.

Слона то я и не приметил )))
Да, там инвертированное выходит, просто логика наоборот или по русски говоря через жопу

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

ua6em спасибо,у вас тоже почта не работает?

 

Сделал так.


  if if (ReleON==0) digitalWrite(RelePin, HIGH);
  else digitalWrite(RelePin, LOW);

 

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

работает, ник - на яндексе

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

Я бы код для себя сделал более удобочитаемым

 

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

А как именно?

Гляньте почту.

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

Хотел дать ссылку, как надо правильно оформлять тексты и переменные, сразу не нашёл, здесь на форуме есть!
Второе, я  совсем не специалист в программировании, пишу, чтобы было понятно мне.

1. Освободил бы переменную ReleON для целей состояния реле, то есть включенное состояние реле
byte ReleON=LOW, а вашем случае можно и не эконмить на переменных и ввести еще одну
byte ReleOFF=HIGH

2.Ввел переменную определения напряжения Vin_OK к примеру

Тогда условия проверки были бы другие
 

if (Vin_OK==1) digitalWrite(RelePin,ReleON);
else digitalWrite(RelePin,ReleOFF);

 

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

ua6em пишет:

Хотел дать ссылку, как надо правильно оформлять тексты и переменные, сразу не нашёл, здесь на форуме есть!
Второе, я  совсем не специалист в программировании, пишу, чтобы было понятно мне.

1. Освободил бы переменную ReleON для целей состояния реле, то есть включенное состояние реле
byte ReleON=LOW, а вашем случае можно и не эконмить на переменных и ввести еще одну
byte ReleOFF=HIGH

2.Ввел переменную определения напряжения Vin_OK к примеру

Тогда условия проверки были бы другие
 

if (Vin_OK==1) digitalWrite(RelePin,ReleON);
else digitalWrite(RelePin,ReleOFF);

 

Ну тогда если так писать то выдает вот тут ошибку.

 

 if (Vin_OK==0) digitalWrite(RelePin,ReleON);

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

не может быть )))

(для инверсного реле, для обычного поменять значения ReleON и ReleOFF на противоположные)
 

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
byte Vin_OK=0;

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

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

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

  if (sensorValue <= 335 || sensorValue >= 486) Vin_OK = 0; //тут делаем сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue >= 382 && sensorValue <= 415)  Vin_OK = 1; // тут делаем период включения между  170в и 180в,и между 240в и 250в


  if (Vin_OK == 1) digitalWrite(RelePin, ReleON);
  else digitalWrite(RelePin, ReleOFF);


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

  delay(100);
}

 

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

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

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
byte Vin_OK=0;

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

#include "pitches.h"

// notes in the melody:
int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };

/******************** Бипер ***********************/
void bipers() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 333 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}
void setup() {
  Serial.begin(9600);// скорость порта
  pinMode(RelePin, OUTPUT);
}

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

  if (sensorValue <= 335 || sensorValue >= 486) Vin_OK = 0; //тут делаем сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue >= 382 && sensorValue <= 415)  Vin_OK = 1; // тут делаем период включения между  170в и 180в,и между 240в и 250в


  if (Vin_OK == 1) digitalWrite(RelePin, ReleON);
  else digitalWrite(RelePin, ReleOFF);


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

  delay(100);
}

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

 Спасибо вам ua6em,ваш код отрабатывает как надо,но вот с бузером проблема,в при компиляции ошибка. Не знаю правильно ли я сделал, 49 строке ошибка.

#include "pitches.h"
// notes in the melody:

int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине 
int sensorValue = 0; //с чего мерим напряжения в сети
byte Vin_OK=0;

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

/******************** ����� ***********************/
void bipers() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second

    // divided by the note type.

    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.

    int noteDuration = 333 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);
    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

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

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

  if (sensorValue <= 335 || sensorValue >= 486) {Vin_OK = 0; bipers()} //тут делаем сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue >= 382 && sensorValue <= 415)  {Vin_OK = 1; bipers()} // тут делаем период включения между  170в и 180в,и между 240в и 250в ВОТ ТУТ ОШИБКА...


  if (Vin_OK == 1) digitalWrite(RelePin, ReleON);
  else digitalWrite(RelePin, ReleOFF);


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

  delay(100);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
#include "pitches.h"
// notes in the melody:

int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине 
int sensorValue = 0; //с чего мерим напряжения в сети
byte Vin_OK=0;

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

/******************** ����� ***********************/
void bipers() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second

    // divided by the note type.

    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.

    int noteDuration = 333 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);
    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

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

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

  if (sensorValue <= 335 || sensorValue >= 486) {Vin_OK = 0; bipers();} //тут делаем сравнение двух значении если в сети 170в или 250в то сбрасываем флаг


  else if (sensorValue >= 382 && sensorValue <= 415)  {Vin_OK = 1; bipers();} // тут делаем период включения между  170в и 180в,и между 240в и 250в  уже не должно быть ошибки, точка с запятой после функции пропущены

  if (Vin_OK == 1) digitalWrite(RelePin, ReleON);
  else digitalWrite(RelePin, ReleOFF);


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

  delay(100);
}

 

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

Ребята привет,вот код вроде все работает как надо помог мне осилить код уважаемы ua6em,но хотелось бы что бы много уважаемые ГУРУ проверили код,все ли в порядке или нет, поправьте как должно быть если что то не так буду очень благодарен,спасибо.

int sensorPin = A0; // аналоговый вход
int RelePin = 12; // управление реле на 12 пине
int sensorValue = 0; //с чего мерим напряжения в сети
int p = 8; //объявляем переменную с номером пина, на который подключен пьезоэлемент
byte Vin_OK = 0;
byte Flag_T1 = 0;
unsigned int T1 = 20000;  // время задержки реле включения
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(200); //ждем 200 Мс
  noTone(p ); // отключаем

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

  else if (sensorValue >= 412 && sensorValue <= 425) {  // тут делаем период  включения между 172в и 220в,и между 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 digitalWrite(RelePin, ReleOFF);


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

  delay(100);
}

 

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

в идеале строки 43-44 избавить от ногодрыга )))

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

ua6em пишет:

в идеале строки 43-44 избавить от ногодрыга )))

 

Если избавить 43-44 строки то реле не отключается при повышено или пониженном напряжении.

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

Lachin пишет:

ua6em пишет:

в идеале строки 43-44 избавить от ногодрыга )))

Если избавить 43-44 строки то реле не отключается при повышено или пониженном напряжении.

Логику надо поменять, если реле включено или выключено повторно не включать и не выключать, это называется ногодрыг )))

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

Точно уже не осилю сам.

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

а у меня нет идей, может еще один флаг ввести ))) текущее состояние реле

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

ua6em пишет:

а у меня нет идей, может еще один флаг ввести ))) текущее состояние реле

Можно по пробовать,только как сделать.

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

Lachin пишет:

ua6em пишет:

а у меня нет идей, может еще один флаг ввести ))) текущее состояние реле

Можно по пробовать,только как сделать.

44 строку надо всё таки поправить, составлять уровнения мне влом, просто измени и проверь

else if(Vin_OK==0) digitalWrite(RelePin, ReleOFF);

 

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

в 44 строку добавил вот это,но вроде работает все также как и было.

else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);

 

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

Lachin пишет:

в 44 строку добавил вот это,но работает все также как и было.

else if (Vin_OK == 0) digitalWrite(RelePin, ReleOFF);

 

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

ок

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

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

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

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

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

toxikaciya пишет:

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

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

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

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