помогите с циклами

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Дошло до обсурда. Где ошибка?

int f=8;
int g=13;
void setup() {
  pinMode( g, OUTPUT);
 pinMode( f, INPUT);
 
}
 
void loop() {
  if (digitalRead (f)== HIGH);
{
  digitalWrite (g, HIGH);
}
  else
{
  digitalWrite (g,LOW);
}
}
Выдает:
sketch_apr29b:14: error: 'else' without a previous 'if'
 
   else
 
 
Буду очень признателен за помощь.

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

В процессе написания программы управления самодельного станка по упаковке грибного субстрата , вылезла ошибка по циклам. Пришлось изучить работу циклов на более простом коде. Ни чего не вышло. Полный затуп.

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

Ну, если до Обсурда, то вставьте Ваш код как положено - посмотрим.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Благодарю за отклик.

int f=13;
int d=12;
void setup() {
 
 pinMode( f, OUTPUT);
 pinMode( d, INPUT);
}

void loop() 
{
 if  (digitalRead(d) == HIGH);
{
 digitalWrite(f, HIGH);
 delay(3000);
 }
 else
{
 digitalWrite(f, HIGH);
 delay(300);
 digitalWrite(f, LOW);
 delay(300);
 }

}

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Код немножко другой но ошибка та же.

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

в 11 строке:  ";" - лишнее

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

1. Что касается синтаксической ошибки, вопрос: что делает точка с запятой в строке 11?

2. Что касается названия топика - не обнаружил в коде никаких циклов.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Циклов здесь нет. Это я упрощал программу , чтобы найти ошибку. Несколько часов ломал голову.

Не програмировал лет семь, а на ардуино так вообще в первый раз. 

Приперло сделать станок.

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Строка такого плана прокатит.

if (digitalRead(2) == HIGH  && digitalRead(3) == HIGH && digitalRead(4) == HIGH )

просто нужно сравнить несколько значений.

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Разобрался . Строку можно писать так: 

if  (digitalRead(d) == LOW && digitalRead(s) == LOW && digitalRead(a) == LOW);

ЕвгенийП и T.Rook. Благодарю Вас

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

Gribovodov пишет:

Разобрался . Строку можно писать так: 

if  (digitalRead(d) == LOW && digitalRead(s) == LOW && digitalRead(a) == LOW);

Нельзя! От чего шли, к той же ; и пришли

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Опечатка.

А вот цикл While работать не хочет.

void loop() 
{
do
{
 digitalWrite(f, HIGH);
 delay(3000);
 } While  (digitalRead(d) == LOW && digitalRead(s) == LOW && digitalRead(a) == LOW);

 

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

Вы специально сообщения об ошибках не выкладываете, чтобы проверить, разберёмся ли без них?

while не так пишется.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

 

Позор Виктору Перестукину !!!

Признаю. Не специально. 

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Контроллер проглотил. Ура.

void loop() 
{
do
{
 digitalWrite(f, HIGH);
 delay(3000);
 } while  (digitalRead(d) == LOW && digitalRead(s) == LOW && digitalRead(a) == LOW);

for (int i=0; i<20; i++)
{
 digitalWrite(f, HIGH);
 delay(100);
 digitalWrite(f, LOW);
 delay(100);}


}

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Из за чего такая ошибка?

collect2.exe: error: ld returned 1 exit status
 
exit status 1
Ошибка компиляции для платы Arduino Leonardo.
[code]
 // пресс пневматический 
int VCC =1; // вентиль на рабочий ход вертикального цилиндра
int VCD =2; // вентиль возврата вертикального цилиндра
int VPS =3; // датчик исходного положения вертикального 
int VPE =4; // датчик конечного положения вертикального
int HCC =5; // вентиль на рабочий ход горизонтального цилиндра
int HCD =6; // вентиль возврата горизонтального цилиндра
int HPS =7; //  датчик исходного положения горизонтального 
int HPM =8; // датчик среднего положения горизонтального
int HPE =9; // датчик конечного положения горизонтального
int GCC =10; // вентиль на рабочий ход затвора
int GCD =11; // вентиль отпуска затвораpа
int GPS =12; // датчик открытого затвора
int GPE =13;  // датчик закрытого затвора
int fbutton =0; // ножная кнопка
void setap() {
pinMode (VCC, OUTPUT);
pinMode(VCD, OUTPUT);
pinMode(VPS, INPUT);
pinMode(VPE, INPUT);
pinMode(HCC, OUTPUT);
pinMode(HCD, OUTPUT);
pinMode(HPS, INPUT);
pinMode(HPE, INPUT);
pinMode(HPM, INPUT);
pinMode(GCC, OUTPUT);
pinMode(GCD, OUTPUT);
pinMode(GPS, INPUT);
pinMode(GPE, INPUT);
pinMode(fbutton, INPUT);}
void loop(){
do // цикл с опросом стартовых положений
{
  digitalWrite(VCC,LOW);
digitalWrite(VCD, HIGH);// ставим цилиндры в исходное положение
digitalWrite(HCC,LOW);
digitalWrite(HCD, HIGH);
digitalWrite(GCC,LOW);
digitalWrite(GCD, HIGH);
}while(digitalRead(VPE) == LOW && digitalRead(HPS) == LOW && digitalRead(GPS) == LOW && digitalRead(fbutton) == LOW);//ПОКА ЦИЛИНДРЫ НЕ ВСТАНУТ В START
//КРОМЕ ЦИЛИНДРОВ СМОТРИМ НА КНОПКУ если встали начинаем цикл сжатия субстрата 
do  // цикл с опросом нижнего положения вертикального цилиндра
{
digitalWrite(VCD, LOW); // снимаем питание с decompresor
digitalWrite(HCD, LOW);
digitalWrite(GCD, LOW);
digitalWrite(VCC, HIGH); // жмем вертикальным
digitalWrite(GCC, HIGH); // жмем ЗАТВОРОМ
}while(digitalRead(VPE) == LOW); // ЖДЕМ ОТКЛИК ОТ ВЕРТИКАЛЬНОГО  VPE ЕСЛИ HIGT ТО ЖМЕМ ДАЛЬШЕ ГОРИЗОНТАЛЬНЫМ
do
{
digitalWrite(HCC, HIGH); //ЖМЕМ ГОРИЗОНТАЛЬНЫМ ДО СЕРЕДИНЫ
}while(digitalRead(HPM) == LOW); // ЖДЕМ ОТКЛИК ОТ СРЕДНЕЙ ТОЧКИ . ЕСЛИ ДА ТО СНИМАЕМ ПИТАНИЕ
digitalWrite(HCC, LOW); // снимаем питание с compresor ГОРИЗОНТАЛЬНОГО
digitalWrite(VCD, HIGH);// ВОЗВРАЩАЕМ ВЕРТИКАЛЬНЫЙ НА ИСХОДНУЮ
delay (200);
do
{
digitalWrite(GCC, LOW);
digitalWrite(GCD, HIGH); //ОТКРЫВАЕМ ЗАТВОР
}while(digitalRead(GPS) == LOW); // ЖДЕМ ОТКЛИК ОТ ЗАТВОРА НА СТАРТ
//ЕСЛИ ДА ТО ВЫПЛЕВЫВАЕМ БЛОК
do
{
digitalWrite(HCC, HIGH); //ЖМЕМ ГОРИЗОНТАЛЬНЫМ ДО КОНЦА

}while(digitalRead(HPE) == LOW);// ЖДЕМ ОТКЛИКА ВЫПЛЮНУТОГО БЛОКА
}






[/code]

 

 
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
// пресс пневматический 
int VCC =1; // вентиль на рабочий ход вертикального цилиндра
int VCD =2; // вентиль возврата вертикального цилиндра
int VPS =3; // датчик исходного положения вертикального 
int VPE =4; // датчик конечного положения вертикального
int HCC =5; // вентиль на рабочий ход горизонтального цилиндра
int HCD =6; // вентиль возврата горизонтального цилиндра
int HPS =7; //  датчик исходного положения горизонтального 
int HPM =8; // датчик среднего положения горизонтального
int HPE =9; // датчик конечного положения горизонтального
int GCC =10; // вентиль на рабочий ход затвора
int GCD =11; // вентиль отпуска затвораpа
int GPS =12; // датчик открытого затвора
int GPE =13;  // датчик закрытого затвора
int fbutton =0; // ножная кнопка
void setap() {   <----  В АРДУИНЕ ПОЛОЖЕНО ПИСАТЬ setup  а не setap 
pinMode (VCC, OUTPUT);
pinMode(VCD, OUTPUT);
pinMode(VPS, INPUT);
pinMode(VPE, INPUT);
pinMode(HCC, OUTPUT);
pinMode(HCD, OUTPUT);
pinMode(HPS, INPUT);
pinMode(HPE, INPUT);
pinMode(HPM, INPUT);
pinMode(GCC, OUTPUT);
pinMode(GCD, OUTPUT);
pinMode(GPS, INPUT);
pinMode(GPE, INPUT);
pinMode(fbutton, INPUT);}
void loop(){
do // цикл с опросом стартовых положений
{
  digitalWrite(VCC,LOW);
digitalWrite(VCD, HIGH);// ставим цилиндры в исходное положение
digitalWrite(HCC,LOW);
digitalWrite(HCD, HIGH);
digitalWrite(GCC,LOW);
digitalWrite(GCD, HIGH);
}while(digitalRead(VPE) == LOW && digitalRead(HPS) == LOW && digitalRead(GPS) == LOW && digitalRead(fbutton) == LOW);//ПОКА ЦИЛИНДРЫ НЕ ВСТАНУТ В START
//КРОМЕ ЦИЛИНДРОВ СМОТРИМ НА КНОПКУ если встали начинаем цикл сжатия субстрата 
do  // цикл с опросом нижнего положения вертикального цилиндра
{
digitalWrite(VCD, LOW); // снимаем питание с decompresor
digitalWrite(HCD, LOW);
digitalWrite(GCD, LOW);
digitalWrite(VCC, HIGH); // жмем вертикальным
digitalWrite(GCC, HIGH); // жмем ЗАТВОРОМ
}while(digitalRead(VPE) == LOW); // ЖДЕМ ОТКЛИК ОТ ВЕРТИКАЛЬНОГО  VPE ЕСЛИ HIGT ТО ЖМЕМ ДАЛЬШЕ ГОРИЗОНТАЛЬНЫМ
do
{
digitalWrite(HCC, HIGH); //ЖМЕМ ГОРИЗОНТАЛЬНЫМ ДО СЕРЕДИНЫ
}while(digitalRead(HPM) == LOW); // ЖДЕМ ОТКЛИК ОТ СРЕДНЕЙ ТОЧКИ . ЕСЛИ ДА ТО СНИМАЕМ ПИТАНИЕ
digitalWrite(HCC, LOW); // снимаем питание с compresor ГОРИЗОНТАЛЬНОГО
digitalWrite(VCD, HIGH);// ВОЗВРАЩАЕМ ВЕРТИКАЛЬНЫЙ НА ИСХОДНУЮ
delay (200);
do
{
digitalWrite(GCC, LOW);
digitalWrite(GCD, HIGH); //ОТКРЫВАЕМ ЗАТВОР
}while(digitalRead(GPS) == LOW); // ЖДЕМ ОТКЛИК ОТ ЗАТВОРА НА СТАРТ
//ЕСЛИ ДА ТО ВЫПЛЕВЫВАЕМ БЛОК
do
{
digitalWrite(HCC, HIGH); //ЖМЕМ ГОРИЗОНТАЛЬНЫМ ДО КОНЦА

}while(digitalRead(HPE) == LOW);// ЖДЕМ ОТКЛИКА ВЫПЛЮНУТОГО БЛОКА
}

строка 16

Gribovodov
Offline
Зарегистрирован: 29.04.2017

А что с ней? К паременной привязал вывод . На плате он указан как 0. Для проверки ставлю другое число - таже ошибка.

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Gribovodov пишет:

Из за чего такая ошибка?

collect2.exe: error: ld returned 1 exit status

Из-за WinXP.

Или обнови винду хотя бы до Win7, или поставь старую версию Arduino IDE (1.0.5, 1.5.*, 1.6.*)

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

Gribovodov пишет:

А что с ней? К паременной привязал вывод . На плате он указан как 0. Для проверки ставлю другое число - таже ошибка.

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

Вы либо не читаете, что Вам пишут, либо специально нас троллите. Вы открывали код, который Вам человек привёл? Читали его комментарий к 16-ой строке? Уж не знаю, как можно сказать понятнее - опечатку, блин, исправьте!

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Прошу прощения. Я новичок на форуме . Не обратил внимания на ссылку. 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Винипуху спасибо. Все заработало. Зря снёс ARDUINO IDE 1.8.2

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Jeka_M пишет:

Gribovodov пишет:

Из за чего такая ошибка?

collect2.exe: error: ld returned 1 exit status

Из-за WinXP.

Или обнови винду хотя бы до Win7, или поставь старую версию Arduino IDE (1.0.5, 1.5.*, 1.6.*)

кстати, и на Win7 я, так же, умудряюсь получить ошибку collect2.exe, если особый бред пробую компиллять.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

На ARDUINO это первая "серьёзная" программа ,  бреда хоть отбавляй. С Вашей помощью программа заработала. Еще раз оромное спасибо!  Теперь несколько дней железу посвящу.

Сейчас делаю наброски на счётчик "моточасов". Эта часть программы должна считать количество станочных циклов и результат записывать в энергонезависимую память.(что-то вроде общего пробега автомобиля).

Волнует следующий момент.  Планирую реализовать эту функцию через хранение переменной типа long в eerprom , и каждый цикл считывать значение , прибавлять 1 и записывать обратно.Далее информация выводится на LCD 1602 индикатор.  Но эта память рассчитана примерно на 100000 циклов. Означает ли это, что через 100000 циклов этот модуль будет работать не корректно?  100000 для станка это пару месяцев работы.

 

Возможно кто то сталкивался или знает как оптимально  составить алгоритм программы лишенного этого недостатка.

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Ещё бредовая идея: При старте считывать значение с eerprom и в процессе работы крутить её в ОЗУ. Одновременно считывать напряжение питания, как только питание просядит (выходная ёмкость БП должна быть соответствующей), пишем текущее значение обратно в eerprom.

Прошу Вашего мнения.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Gribovodov пишет:

Волнует следующий момент.  Планирую реализовать эту функцию через хранение переменной типа long в eerprom , и каждый цикл считывать значение , прибавлять 1 и записывать обратно.Далее информация выводится на LCD 1602 индикатор.  Но эта память рассчитана примерно на 100000 циклов. Означает ли это, что через 100000 циклов этот модуль будет работать не корректно?  100000 для станка это пару месяцев работы.

В общем случае эта проблема решение не имеет. Но, как правило, имеет различные варианты решения для конкретных условий.

1. Самое первое - сравнивать новое значение со считанным и писать только в том случае, если они различаются.

2. Использовать внешнюю EEPROM и менять ее при проведении профилактических работ каждые 2-3 месяца.

3. Вы сами предложили в сообщении выше - одно из стандарных решений.

T.Rook
Offline
Зарегистрирован: 05.03.2016

andriano пишет:

Gribovodov пишет:

Волнует следующий момент.  Планирую реализовать эту функцию через хранение переменной типа long в eerprom , и каждый цикл считывать значение , прибавлять 1 и записывать обратно.Далее информация выводится на LCD 1602 индикатор.  Но эта память рассчитана примерно на 100000 циклов. Означает ли это, что через 100000 циклов этот модуль будет работать не корректно?  100000 для станка это пару месяцев работы.

В общем случае эта проблема решение не имеет. Но, как правило, имеет различные варианты решения для конкретных условий.

....

2. Использовать внешнюю EEPROM и менять ее при проведении профилактических работ каждые 2-3 месяца.

....

Как вариант - внешнюю SD карточку

sadman41
Offline
Зарегистрирован: 19.10.2016

Еще варианты:

FRAM -  https://habrahabr.ru/post/319336/

NV RAM в DS1302/DS1307

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Итересное наблюдение.

Необходимо считывать четаре входа и если на всех единица , то запускаем процесс (логический элемент & с четырьмя входами). Взяв во внимание (http://arduino.ru/Reference/Boolean) написал строку так :

while(digitalRead(VPE) == LOW && digitalRead(HPS) == LOW && digitalRead(GPS) == LOW && digitalRead(fbutton) == LOW);

Но у меня эта строка работает как "или" Для исключения ошибки собрал отдельную схему.

В результате строка заработала как надо в таком виде:

while(digitalRead(VPS) == LOW || digitalRead(HPS) == LOW || digitalRead(GPS) == LOW || digitalRead(fbutton) == LOW);

Может  while какойто особенный оператор ?

В результате мозги с исполняющими механизмами для станка заработали. Но есть недопонимание в этом вопросе.

 

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

sadman41 пишет:

Еще варианты:

FRAM -  https://habrahabr.ru/post/319336/

NV RAM в DS1302/DS1307

Шикарный вариант!

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

Ваш while так как он написан, будет крутиться в бесконечно цикле ничегонеделания до тех пор, пока хотя бы на одном входе 0. И только, когда на всех входах окажется 1, начнёт выполняться то, что в программе идёт после этого while. Стало понятнее или по-прежнему неясно что делается?

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

Блин Ну почему не записать так 

while (!digitalRead(VPS) || ! digitalRead(HPS) || ! digitalRead(GPS)  || ! digitalRead(fbutton));

Но нет, надо нагородить кучу букв и потом терятся.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

[quote=ЕвгенийП]

Ваш while так как он написан, будет крутиться в бесконечно цикле ничегонеделания до тех пор, пока хотя бы на одном входе 0. И только, когда на всех входах окажется 1, начнёт выполняться то, что в программе идёт после этого while. 

Так это мне и надо. 

Я про другое . Почему  "&&" не работает как логическое "и" , а пришлось написать "ll" .

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

T.Rook пишет:

Как вариант - внешнюю SD карточку

Угу, в 10 раз дороже при в 10 раз меньшем ресурсе.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

qwone пишет:

Блин Ну почему не записать так 

while (!digitalRead(VPS) || ! digitalRead(HPS) || ! digitalRead(GPS)  || ! digitalRead(fbutton));

Но нет, надо нагородить кучу букв и потом терятся.

Я пока в тонкастях написания не "ботаю" , пишу  как в букваре написанно .

За вариант написания благодарю . Только он мне пока не понятен. Разберусь.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Gribovodov пишет:

Я про другое . Почему  "&&" не работает как логическое "и" , а пришлось написать "ll" .

1. "&&" вполне себе работает, как и должно.

2. "ll" - это логическое "или", которое тоже работает, но совсем не так, как логическое "и".

Gribovodov
Offline
Зарегистрирован: 29.04.2017

В целом сегмент так выглядет.

do // цикл с опросом стартовых положений
{
  digitalWrite(VCC,LOW);
digitalWrite(VCD, HIGH);// ставим цилиндры в исходное положение
digitalWrite(HCC,LOW);
digitalWrite(HCD, HIGH);
digitalWrite(GCC,LOW);
digitalWrite(GCD, HIGH);
}while(digitalRead(VPS) == LOW || digitalRead(HPS) == LOW || digitalRead(GPS) == LOW || digitalRead(fbutton) == LOW)

 

Gribovodov
Offline
Зарегистрирован: 29.04.2017

andriano пишет:

Gribovodov пишет:

Я про другое . Почему  "&&" не работает как логическое "и" , а пришлось написать "ll" .

1. "&&" вполне себе работает, как и должно.

2. "ll" - это логическое "или", которое тоже работает, но совсем не так, как логическое "и".

Хоть видео снимай, как у меня на столе с кнопками и светодиодами работает.

Gribovodov
Offline
Зарегистрирован: 29.04.2017

Понимаю, что чудес не бывает. Но где косяк не знаю. В принципе программа работает как надо.

Может попробывать на старой версии компилятора. Я на 1.8.2

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

Gribovodov]</p> <p>[quote=ЕвгенийП пишет:

Ваш while так как он написан, будет крутиться в бесконечно цикле ничегонеделания до тех пор, пока хотя бы на одном входе 0. И только, когда на всех входах окажется 1, начнёт выполняться то, что в программе идёт после этого while. 

Так это мне и надо. 

Я про другое . Почему  "&&" не работает как логическое "и" , а пришлось написать "ll" .

Перечитайте внимательно то, что а написал. 

Вы блин с чем сравниваете? С 0 или с 1. Очевидно, с 0. Тогда какое И? Вам надо крутиться в цикле до тех пор, пока там есть хоть один 0 - конечно же надо ИЛИ использовать.

Т.е. у Вас написано "крутиться в цикле пока там хоть один ноль"

Если Вы хотите использовать И, так писать надо по другому: прекращать крутиться в цикле, когда там все единицы.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Gribovodov пишет:

Хоть видео снимай, как у меня на столе с кнопками и светодиодами работает.

https://youtu.be/W8AIDvaaOVM?list=RDi9AHJkHqkpw&t=74

Gribovodov
Offline
Зарегистрирован: 29.04.2017

 

Вы блин с чем сравниваете? С 0 или с 1. Очевидно, с 0. Тогда какое И?-

Ключевой момент .

Потихоньку начал "догонять".

На свежую голову вернусь к этому вопросу. Надо все варианты проиграть.