Ошибка в скетче ?
- Войдите на сайт для отправки комментариев
Сб, 05/01/2019 - 21:57
Здравствуйте!
Пишу скетч для управления теплицей на Mege. На данный момент задумано так: начался дождь - форточка через несколько секунд закрывается, кончился дождь - форточка через несколько секунд открывается.
Выдает ошибку со скобками. Голову сломал - подскажите чайнику пожалуйста!
А может можно было вообще проще сделать? Заранее благодарен!
int rainSensePin = A15; // аналоговый вход 15 для сигнала датчика
int RainCounter = 0; // счётчик продолжительности дождя
int fort_pos = 0; //положение форточек теплицы: 0 - открыты, 1 - закрыты
unsigned long last_time;
void setup() {
Serial.begin(9600);
pinMode(rainSensePin, INPUT);
pinMode(34, OUTPUT); //реле мотора форточек
pinMode(35, OUTPUT);
pinMode(36, OUTPUT);
pinMode(37, OUTPUT);
}
void loop() {
int rainSenseReading = analogRead(rainSensePin);
Serial.println(rainSenseReading);
if (millis() - last_time > 3000) {
if (rainSenseReading < 300) and (fort_pos = 0){ //если начался дождь и форточки открыты
if (RainCounter < 30)
{
RainCounter = RainCounter + 1; //таймер закрытия
}
if (RainCounter = 30)
{
digitalWrite(36, HIGH); //включение реле закрытия форточки
digitalWrite(37, HIGH); //включение реле закрытия форточки
}
}
if (rainSenseReading > 300) and (fort_pos = 1) { //если дождя нет и форточки закрыты
if (RainCounter > 0)
{
RainCounter = RainCounter - 1 //таймер открытия
}
if (RainCounter = 0)
{ digitalWrite(34, HIGH); //включение реле открытия форточки
digitalWrite(35, HIGH); //включение реле открытия форточки
}
}
}
Ошибка в поведении на форуме.
Читать до полного просветвления.
вставьте код по правилам форума
int rainSensePin = A15; // аналоговый вход 15 для сигнала датчика int RainCounter = 0; // счётчик продолжительности дождя int fort_pos = 0; //положение форточек теплицы: 0 - открыты, 1 - закрыты unsigned long last_time; void setup() { Serial.begin(9600); pinMode(rainSensePin, INPUT); pinMode(34, OUTPUT); //реле мотора форточек pinMode(35, OUTPUT); pinMode(36, OUTPUT); pinMode(37, OUTPUT); } void loop() { int rainSenseReading = analogRead(rainSensePin); Serial.println(rainSenseReading); if (millis() - last_time > 3000) { if (rainSenseReading < 300) and (fort_pos = 0){ //если начался дождь и форточки открыты if (RainCounter < 30) { RainCounter = RainCounter + 1; //таймер закрытия } if (RainCounter = 30) { digitalWrite(36, HIGH); //включение реле закрытия форточки digitalWrite(37, HIGH); //включение реле закрытия форточки } } if (rainSenseReading > 300) and (fort_pos = 1) { //если дождя нет и форточки закрыты if (RainCounter > 0) { RainCounter = RainCounter - 1 //таймер открытия } if (RainCounter = 0) { digitalWrite(34, HIGH); //включение реле открытия форточки digitalWrite(35, HIGH); //включение реле открытия форточки } } }Сорри, исправился
в цикле одной закрывающей нет
Если несложно, покажите где и чего не хватает
Если несложно, покажите где и чего не хватает
поставьте 47 строкой закрывающую скобку, должно откомпилироваться, а правильно или нет с вашими вложенными if решать вам
int rainSensePin = A15; // аналоговый вход 15 для сигнала датчика int RainCounter = 0; // счётчик продолжительности дождя int fort_pos = 0; //положение форточек теплицы: 0 - открыты, 1 - закрыты unsigned long last_time; void setup() { Serial.begin(9600); pinMode(rainSensePin, INPUT); pinMode(34, OUTPUT); //реле мотора форточек pinMode(35, OUTPUT); pinMode(36, OUTPUT); pinMode(37, OUTPUT); } void loop() { int rainSenseReading = analogRead(rainSensePin); Serial.println(rainSenseReading); if (millis() - last_time > 3000) { if (rainSenseReading < 300 && fort_pos == 0){ //если начался дождь и форточки открыты if (RainCounter < 30) { RainCounter = RainCounter + 1; //таймер закрытия } if (RainCounter = 30) { digitalWrite(36, HIGH); //включение реле закрытия форточки digitalWrite(37, HIGH); //включение реле закрытия форточки } } if (rainSenseReading > 300 && fort_pos == 1) { //если дождя нет и форточки закрыты if (RainCounter > 0) { RainCounter = RainCounter - 1; //таймер открытия } if (RainCounter = 0) { digitalWrite(34, HIGH); //включение реле открытия форточки digitalWrite(35, HIGH); //включение реле открытия форточки } } } }http://arduino.ru/Reference/Boolean
Спасибо!
У Вас Переменная last_time не меняется, т.к. Вы забыли в конце цикла: last_time = millis();
И вообще данный скетч лучше в виде автомата Пуха.- 4 состояния Форточка открыта,форточка закрывается,форточка закрыта,фоточка открывается. А также автомат датчика - на 2 состояния идет дождь,нет дождя.
Как Вы понимаете строки №№ 27 и 41?
Вам бы основы почитать. Даже если Вам расставят все скобки, количество бреда в коде от этого не уменьшится.
В работе не проверял
/**/ //#1- датчик дождя const byte rainSensePin = /*пин*/A0; // датчик дождя const int valRain = 300; /*состояние нет дождя,идет дождь*/ enum state1_t {sNoRain, sRain} state1; unsigned long past1; //#2-управление окнами const byte Motor1PlusPin = /*пин*/2;/*+мотор 1 форточки*/ const byte Motor1MinusPin = /*пин*/3;/*-мотор 1 форточки*/ const byte Motor2PlusPin = /*пин*/4;/*+мотор 2 форточки*/ const byte Motor2MinusPin = /*пин*/5;/*-мотор 2 форточки*/ /*состояние открыто,закрывается,закрыто,открывается*/ enum state2_t {sOpen, sClosed, sClose, sOpened} state2; unsigned long past2; const unsigned long time1min = 60000;/*время для закрытия окошек*/ void stand2(state2_t s) { state2 = s; past2 = millis(); switch (state2) { case sOpen: digitalWrite(Motor1PlusPin , LOW); digitalWrite(Motor1MinusPin, LOW); digitalWrite(Motor2PlusPin , LOW); digitalWrite(Motor2MinusPin, LOW); break; case sClosed: digitalWrite(Motor1PlusPin , LOW); digitalWrite(Motor1MinusPin, HIGH); digitalWrite(Motor2PlusPin , LOW); digitalWrite(Motor2MinusPin, HIGH); break; case sClose: digitalWrite(Motor1PlusPin , LOW); digitalWrite(Motor1MinusPin, LOW); digitalWrite(Motor2PlusPin , LOW); digitalWrite(Motor2MinusPin, LOW); break; case sOpened: digitalWrite(Motor1PlusPin , HIGH); digitalWrite(Motor1MinusPin, LOW); digitalWrite(Motor2PlusPin , HIGH); digitalWrite(Motor2MinusPin, LOW); break; } } //------------------------------------------- void setup() { //#1- датчик дождя Serial.begin(9600); pinMode(rainSensePin, INPUT); state1 = sRain; stand2(sClosed); //#2-управление окнами pinMode(Motor1PlusPin, OUTPUT); pinMode(Motor2PlusPin, OUTPUT); pinMode(Motor1MinusPin, OUTPUT); pinMode(Motor2MinusPin, OUTPUT); } void loop() { //#1- датчик дождя if (millis() - past1 > 3000) { past1 = millis(); int rainSenseReading = analogRead(rainSensePin);/*меньше valRain идет дождь,выше сушь*/ Serial.println(rainSenseReading); switch (state1) { case sNoRain: if (rainSenseReading <= valRain) { /*обнаружен дождь*/ state1 = sRain; if (state2 == sOpen) stand2(sClosed); if (state2 == sOpened) stand2(sClosed); } break; case sRain: if (rainSenseReading > valRain + 30) { /*обнаружено отсутсвие дождя*/ state1 = sNoRain; if (state2 == sClose) stand2(sOpened); if (state2 == sClosed) stand2(sOpened); } break; } } //#2-управление окнами switch (state2) { case sOpen: break; case sClosed: if (millis() - past2 >= time1min) stand2(sClose); break; case sClose: break; case sOpened: if (millis() - past2 >= time1min) stand2(sOpen); break; } } /**/Как Вы понимаете строки №№ 27 и 41?
хм... ИМХО, так и понимает, как большинство нормальных людей, учившихся в средней школе:
22. "если RainCounter меньше тридцати"
27. "если RainCounter равно тридцати" и т.д.
Потом человек наступает на эти грабли: "Запись равенства в Си
==является источником частых ошибок из-за возможности использования присваивания в управляющих конструкциях," - и далеко не он один."Общеизвестным плохим примером является выбор знака равенства для обозначения присваивания, восходящий к языку Fortran в 1957 году и слепо повторяемый до сих пор массой разработчиков языков. Эта плохая идея низвергает вековую традицию использования знака «=» для обозначения сравнения на равенство, предиката, принимающего значения «истина» или «ложь». "
Чуть позже ТС свыкнется с этим синтаксическим извращением. И с многими другими.
Поясните пожалуйста!
Как я понял - 300 это пороговое значение датчика дождя, при значении более 300 - сушь, менее - дождь...
Снимать показания с датчика чаще чем раз в минуту видимо тоже не стоит...
Лично я бы написание скетча с этого и начал
Поясните пожалуйста!
Я про скетч в посте #9. Сравните строки №№ 20 и 34 со строками №№ 27 и 41. Неужели ничего не смущает?
Поясните пожалуйста!
Я про скетч в посте #9. Сравните строки №№ 20 и 34 со строками №№ 27 и 41. Неужели ничего не смущает?
ua6em исправил и отослал потом ТС в посте #10 на учебу. А вот помогло или нет...
Поясните пожалуйста!
Я про скетч в посте #9. Сравните строки №№ 20 и 34 со строками №№ 27 и 41. Неужели ничего не смущает?
В скетчах на языке С мне сложно вникнуть в чужой полёт мысли )))
В первых строках он запускает некоторый счетчик и, закрывает форточку по прошествии некоторого времени, во втором - аналогично, но счетчик в режиме обратного отсчета, извращение конечно...а вот правильный ли алгоритм чтением с листа сказать не могу, увы...
И вообще, я бы писал функциями и их вызывал
ua6em, да Вы не о том. Я про то, в одних местах сравнение "==", а в других "=". Смотрите внимательнее!
Я уж полгода как показал тебе пример, на котором твой класс глючит, а он так и лежит неисправленный!
У меня не глючит, это у вас глючит. Вон прошло сколько времени, а вас глюки не отпускают.
Квон, пожалуйста, я тебя очень прошу, не превращайся в Архата. Ты мой пример запускал? Работает некорректно? Ну, а зачем ты сейчас пургу-то несёшь. Это у Архата с логиком каждый ляп - фича, ты то зачем туда же лезешь? Ну, правда?
У меня не глючит,
Значит, Вы его просто не запускали. Глюк там явный (буквы пропадают), да и ошибка очевидная.
ua6em, да Вы не о том. Я про то, в одних местах сравнение "==", а в других "=". Смотрите внимательнее!
ДЕЦКИЕ АШИПКИ я ему поправил )))
Думал там в логике что-то
у меня этих автоматов только в военном записано было штук семь... )))
Что примечательно:
"=" у нас присвоение,
"==" - равенство,
а неравенство? "!=="? Нет, "!="
В грузинской школе.
Учитель: "Запомните, дети тарелька и вилька пишется без мягкого знака,
а сол и фасол с мягким знаком запомните это дети, ибо понять этого не
возможно!!!"
"=" у нас присвоение,
"==" - равенство,
Скажите спасибо, что язык такой понятный. В некоторых языках, наряду с "=" и "==" ещё и "===" есть :)))
у меня этих автоматов только в военном записано было штук семь... )))
О, я тут заставку для автоматов нашел.))))
