Ошибка в скетче ?

Tanatos
Offline
Зарегистрирован: 17.12.2018
Здравствуйте!
Пишу скетч для управления теплицей на 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); //включение реле открытия форточки
      }
    }
  }
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ошибка в поведении на форуме.

Читать до полного просветвления.

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

вставьте код по правилам форума

Tanatos
Offline
Зарегистрирован: 17.12.2018
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); //включение реле открытия форточки
      }
    }
  }

 

Tanatos
Offline
Зарегистрирован: 17.12.2018

Сорри, исправился

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

в цикле одной закрывающей нет

Tanatos
Offline
Зарегистрирован: 17.12.2018

Если несложно, покажите где и чего не хватает

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

Tanatos пишет:

Если несложно, покажите где и чего не хватает

поставьте 47 строкой закрывающую скобку, должно откомпилироваться, а правильно или нет с вашими вложенными if решать вам

Tanatos
Offline
Зарегистрирован: 17.12.2018
Добавил закрывающую в 47 строку. Ничего не изменилось (
 
In function 'void loop()':
 
sketch_jan05d:20:37: error: expected identifier before '(' token
 
     if (rainSenseReading < 300) and (fort_pos = 0){ 
 
                                     ^
 
sketch_jan05d:34:39: error: expected identifier before '(' token
 
       if (rainSenseReading > 300) and (fort_pos = 1) {
 
                                       ^
 
exit status 1
expected identifier before '(' token
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
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); //включение реле открытия форточки
      }
    }
  }
}

 

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

Спасибо!

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

У Вас Переменная last_time не меняется, т.к. Вы забыли в конце цикла: last_time = millis();

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И вообще данный скетч лучше в виде автомата Пуха.- 4 состояния Форточка открыта,форточка закрывается,форточка закрыта,фоточка открывается. А также автомат датчика - на 2 состояния идет дождь,нет дождя.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как Вы понимаете строки №№ 27 и 41?

Вам бы основы почитать. Даже если Вам расставят все скобки, количество бреда в коде от этого не уменьшится.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

В работе не проверял

/**/
//#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;
  }
}
/**/

 

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

Как Вы понимаете строки №№ 27 и 41?

хм... ИМХО, так и понимает, как большинство нормальных людей, учившихся в средней школе:

22. "если RainCounter меньше тридцати"

27. "если RainCounter равно тридцати"   и т.д.

Потом человек наступает на эти грабли: "Запись равенства в Си == является источником частых ошибок из-за возможности использования присваивания в управляющих конструкциях,"   - и далеко не он один.

 

"Общеизвестным плохим примером является выбор знака равенства для обозначения присваивания, восходящий к языку Fortran в 1957 году и слепо повторяемый до сих пор массой разработчиков языков. Эта плохая идея низвергает вековую традицию использования знака «=» для обозначения сравнения на равенство, предиката, принимающего значения «истина» или «ложь». "

 

Чуть позже ТС свыкнется с этим синтаксическим извращением. И с многими другими.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLKH пишет:
так и понимает, как большинство нормальных людей
Это бы я понял, но меня смущает при этом строка №20. В ней он "ненормальный человек" или как?

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

ЕвгенийП пишет:

SLKH пишет:
так и понимает, как большинство нормальных людей
Это бы я понял, но меня смущает при этом строка №20. В ней он "ненормальный человек" или как?


Поясните пожалуйста!
Как я понял - 300 это пороговое значение датчика дождя, при значении более 300 - сушь, менее - дождь...
Снимать показания с датчика чаще чем раз в минуту видимо тоже не стоит...
Лично я бы написание скетча с этого и начал
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Поясните пожалуйста!

Я про скетч в посте #9. Сравните строки №№ 20 и 34 со строками №№ 27 и 41. Неужели ничего не смущает?

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

ЕвгенийП пишет:

ua6em пишет:

Поясните пожалуйста!

Я про скетч в посте #9. Сравните строки №№ 20 и 34 со строками №№ 27 и 41. Неужели ничего не смущает?

ua6em исправил и отослал потом ТС в посте #10 на учебу. А вот помогло или нет...

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

ЕвгенийП пишет:

ua6em пишет:

Поясните пожалуйста!

Я про скетч в посте #9. Сравните строки №№ 20 и 34 со строками №№ 27 и 41. Неужели ничего не смущает?

В скетчах на языке С мне сложно вникнуть в чужой полёт мысли )))
В первых строках он запускает некоторый счетчик и, закрывает форточку по прошествии некоторого времени, во втором - аналогично, но счетчик в режиме обратного отсчета, извращение конечно...а вот правильный ли алгоритм чтением с листа сказать не могу, увы...
И вообще, я бы писал функциями и их вызывал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em, да Вы не о том. Я про то, в одних местах сравнение "==", а в других "=". Смотрите внимательнее!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ua6em пишет:
В скетчах на языке С мне сложно вникнуть в чужой полёт мысли )))
Вот по этой причине я и стараюсь использовать автомат Пуха. Там очень легко понять логику работы программы и ее протестировать на ошибки. И да ТС банально запутался в логике работы программы, а еще паршиво знает Си. Так что основная ошибка скетча, как бы не грустно, это ТС.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

Я уж полгода как показал тебе пример, на котором твой класс глючит, а он так и лежит неисправленный!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У меня не глючит, это у вас глючит. Вон прошло сколько времени, а вас глюки не отпускают.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Квон, пожалуйста, я тебя очень прошу, не превращайся в Архата. Ты мой пример запускал? Работает некорректно? Ну, а зачем ты сейчас пургу-то несёшь. Это у Архата с логиком каждый ляп - фича, ты то зачем туда же лезешь? Ну, правда?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

У меня не глючит, 

Значит, Вы его просто не запускали. Глюк там явный (буквы пропадают), да и ошибка очевидная.

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

ЕвгенийП пишет:

ua6em, да Вы не о том. Я про то, в одних местах сравнение "==", а в других "=". Смотрите внимательнее!

ДЕЦКИЕ АШИПКИ я ему поправил )))
Думал там в логике что-то

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

qwone пишет:

ua6em пишет:
В скетчах на языке С мне сложно вникнуть в чужой полёт мысли )))
Вот по этой причине я и стараюсь использовать автомат Пуха. Там очень легко понять логику работы программы и ее протестировать на ошибки. И да ТС банально запутался в логике работы программы, а еще паршиво знает Си. Так что основная ошибка скетча, как бы не грустно, это ТС.

у меня этих автоматов только в военном записано было штук семь... )))

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

SLKH пишет:
так и понимает, как большинство нормальных людей
Это бы я понял, но меня смущает при этом строка №20. В ней он "ненормальный человек" или как?

Нормальный человек далеко не сразу превращается в true_наСИльника... как раз процесс перехода мы и наблюдаем...

 

Что примечательно:

"=" у нас присвоение,

"==" - равенство,

а неравенство? "!=="?  Нет, "!="

 

В грузинской школе.

Учитель: "Запомните, дети тарелька и вилька пишется без мягкого знака,

а сол и фасол с мягким знаком запомните это дети, ибо понять этого не

возможно!!!"

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLKH пишет:

"=" у нас присвоение,

"==" - равенство,

Скажите спасибо, что язык такой понятный. В некоторых языках, наряду с "=" и "==" ещё и "===" есть :)))

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

qwone пишет:

ua6em пишет:
В скетчах на языке С мне сложно вникнуть в чужой полёт мысли )))
Вот по этой причине я и стараюсь использовать автомат Пуха. Там очень легко понять логику работы программы и ее протестировать на ошибки. И да ТС банально запутался в логике работы программы, а еще паршиво знает Си. Так что основная ошибка скетча, как бы не грустно, это ТС.

у меня этих автоматов только в военном записано было штук семь... )))

О, я тут заставку для автоматов нашел.))))