Ошибка при компиляции.
- Войдите на сайт для отправки комментариев
Вс, 23/04/2017 - 23:00
Ребята привет,подскажите пожалуйста, при компиляции в 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);
}
if( ReleON || sensorValue > 400 || sensorValue < 470)Условие должно быть в скобках.
if( ReleON || sensorValue > 400 || sensorValue < 470)Спасибо,но теперь на 20 строке ошибка,если можете проверьте весь код возможно еще есть ошибки,спасибо.
ReleON = 0;
ReleON = 1;
Операция присваивания - ОДИН знак "равно".
ReleON = 0;
ReleON = 1;
Операция присваивания - ОДИН знак "равно".
Как правельно сделать? только осваиваю,сеичас на 20 строке .
if(!ReleON) digitalWrite(RelePin, HIGH);Количество скобок в выражении считайте.if(!ReleON) digitalWrite(RelePin, HIGH);Количество скобок в выражении считайте.Спасибо вам все Ок,можно вопрос будет ли этот код работать корректно? возможно я что то не так написал,сейчас компиляцию прошла,спасибо.
Словами напишите, при каких условиях ReleON должна быть нулём, и при каких единицей.
Словами напишите, при каких условиях ReleON должна быть нулём, и при каких единицей.
что-то перемудрили )))
а состояния когда не 220-225 но еще и не <170 >250???
Есть стандарт (ГОСТ) на напряжение питающей сети, вот в этих рамках и держите реле включенным, за пределами - выключенным,
всего одна строка программы получается
Хочу сделать вольт контроль,при 170в отключаем реле при 250в тоже отключаем реле,как стало в сети 220в то включаем реле.Но нужно еще так что бы сначала была проверка если в сети есть 220-230в то включаем реле,но если в сети 170в или же 250в то не включаем реле,вот я и пытался сделать такое,но что то не как не выходить получить желаемый результат.
Извините, это не похоже на описание алгоритма и мне сложно это понять. Может быть имеется в виду такой алгоритм :
Изначально реле включено. В промежутках 170-180В и 240-250В ничего не делаем, учитываем гистерезис.
Хочу сделать вольт контроль,при 170в отключаем реле при 250в тоже отключаем реле,как стало в сети 220в то включаем реле.Но нужно еще так что бы сначала была проверка если в сети есть 220-230в то включаем реле,но если в сети 170в или же 250в то не включаем реле,вот я и пытался сделать такое,но что то не как не выходить получить желаемый результат.
Извините, это не похоже на описание алгоритма и мне сложно это понять. Может быть имеется в виду такой алгоритм :
Изначально реле включено. В промежутках 170-180В и 240-250В ничего не делаем, учитываем гистерезис.
Да именно так и нужно.
Исправил == на =
Если я правильно понял то так ?
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в то тоже все равно включено.
Если там точные значения, то попробуйте заменить < на <= и соответственно > на >=
Спасибо вроде получается,но можно спросить если честно не понятно вот это строка с ней чуть не понятно как она работает
Просто дословно переводим :
else if sensorValue > 180 && sensorValue < 240
иначе если sensorValue больше 180 и sensorValue меньше 240
*Вам бы синтаксис языка почитать, яснее и проще всё станет...
Просто дословно переводим :
else if sensorValue > 180 && sensorValue < 240
иначе если sensorValue больше 180 и sensorValue меньше 240
*Вам бы синтаксис языка почитать, яснее и проще всё станет...
Спасибо вам,все завелось как надо,осталось выставить по точней значения.
Вот сделал так,возможно где то что то не так сделал..
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); }А гистерезис точно нужен? Уж очень маленькое окно на включение
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); }Я в таких случаях читаю строку и проговариваю сам себе "если меньше-равно 335-ти ИЛИ больше-равно 486-ти - сбрасываем", "если больше-равно 382-х И при этом меньше-равно 415-ти - поднимаем". Помогает.
Ещё можно мысленно подставить в условия для всех пяти случаев значения (например 330, 350, 390, 450, 490 ) и мысленно же определить, что будет в пяти случаях с ReleOn. Эдакий дебаггер в голове.
в логической правильности этого я сомневаюсь
может в лоб сравнивать?
! (логическое отрицание)
True, если операнд false, и наоборот, например:
if(!x) {// ...}условие верно, если x - false (x равно 0).
в логической правильности этого я сомневаюсь
может в лоб сравнивать?
Ой, не запутывайте, человеку и так нелегко. Там, видимо, реле "инвертированное", так что проще всего digitalWrite(RelePin, !ReleON); написать.
Использую релейный модуль,ардуино UNO.
Я не 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в логической правильности этого я сомневаюсь
может в лоб сравнивать?
Ой, не запутывайте, человеку и так нелегко. Там, видимо, реле "инвертированное", так что проще всего digitalWrite(RelePin, !ReleON); написать.
Слона то я и не приметил )))
Да, там инвертированное выходит, просто логика наоборот или по русски говоря через жопу
ua6em спасибо,у вас тоже почта не работает?
Сделал так.
работает, ник - на яндексе
Я бы код для себя сделал более удобочитаемым
А как именно?
Гляньте почту.
Хотел дать ссылку, как надо правильно оформлять тексты и переменные, сразу не нашёл, здесь на форуме есть!
Второе, я совсем не специалист в программировании, пишу, чтобы было понятно мне.
1. Освободил бы переменную ReleON для целей состояния реле, то есть включенное состояние реле
byte ReleON=LOW, а вашем случае можно и не эконмить на переменных и ввести еще одну
byte ReleOFF=HIGH
2.Ввел переменную определения напряжения Vin_OK к примеру
Тогда условия проверки были бы другие
Хотел дать ссылку, как надо правильно оформлять тексты и переменные, сразу не нашёл, здесь на форуме есть!
Второе, я совсем не специалист в программировании, пишу, чтобы было понятно мне.
1. Освободил бы переменную ReleON для целей состояния реле, то есть включенное состояние реле
byte ReleON=LOW, а вашем случае можно и не эконмить на переменных и ввести еще одну
byte ReleOFF=HIGH
2.Ввел переменную определения напряжения Vin_OK к примеру
Тогда условия проверки были бы другие
Ну тогда если так писать то выдает вот тут ошибку.
не может быть )))
(для инверсного реле, для обычного поменять значения 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); }По бузеру - добавить в код функции и создать новую вкладку в 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); }Спасибо вам 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); }#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,но хотелось бы что бы много уважаемые ГУРУ проверили код,все ли в порядке или нет, поправьте как должно быть если что то не так буду очень благодарен,спасибо.
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); }в идеале строки 43-44 избавить от ногодрыга )))
в идеале строки 43-44 избавить от ногодрыга )))
Если избавить 43-44 строки то реле не отключается при повышено или пониженном напряжении.
в идеале строки 43-44 избавить от ногодрыга )))
Если избавить 43-44 строки то реле не отключается при повышено или пониженном напряжении.
Логику надо поменять, если реле включено или выключено повторно не включать и не выключать, это называется ногодрыг )))
Точно уже не осилю сам.
а у меня нет идей, может еще один флаг ввести ))) текущее состояние реле
а у меня нет идей, может еще один флаг ввести ))) текущее состояние реле
Можно по пробовать,только как сделать.
а у меня нет идей, может еще один флаг ввести ))) текущее состояние реле
Можно по пробовать,только как сделать.
44 строку надо всё таки поправить, составлять уровнения мне влом, просто измени и проверь
в 44 строку добавил вот это,но вроде работает все также как и было.
в 44 строку добавил вот это,но работает все также как и было.
ок
Может быть так в 43 строке:
Либо сделать два if-а с проверкой состояния пина.
Может быть так в 43 строке:
Либо сделать два if-а с проверкой состояния пина.
можно так, снимаем ногодрыг на включение если уже включено