Срабатывание пищалки при загорании одного из нескольких светодиодов
- Войдите на сайт для отправки комментариев
Здравствуйте!
Имею 32 светодиода, 16 кнопок, и один зуммер.
К каждой кнопке завязаны 2 светодиода - красный и желтый. При удерживании кнопки более определенного времени загорается красный светодиод, при отсутствии нажатий определенное аремя - загорается желтый. Если нажимать кнопку в пределах определенного интервала времени - то ни один светодиод не загорится.
И таких вот 16 независимых узлов.
Скетч я вроде бы написал - работает со светодиодами, а вот с зуммером - беда прямо....
При загорании любого из 32 светодиодов должна срабатывать пищалка.
Третьи сутки мучаюсь, и так и сяк пытаюсь и переменными и суммированием - не выходит.
Укажите направление пожалуйста!!!
PS с языком программирования знаком суток 5, изучал все с нуля, так что не ругайтесь.
Заранее благодарен.
Вы в курсе, что экстрасенсы выступают на канале ТНТ, а не тут?
ТНТ и ткаого уровня передачи мне не интересны, я обращаюсь к знающим людям, а не к экстрасенсам.
Чудак! Это был намек, что код не выложен. И выкладывай про правилам форума.
Здравствуйте!
Имею 32 светодиода, 16 кнопок, и один зуммер.
К каждой кнопке завязаны 2 светодиода - красный и желтый. При удерживании кнопки более определенного времени загорается красный светодиод, при отсутствии нажатий определенное аремя - загорается желтый. Если нажимать кнопку в пределах определенного интервала времени - то ни один светодиод не загорится.
И таких вот 16 независимых узлов.
Скетч я вроде бы написал - работает со светодиодами, а вот с зуммером - беда прямо....
При загорании любого из 32 светодиодов должна срабатывать пищалка.
Третьи сутки мучаюсь, и так и сяк пытаюсь и переменными и суммированием - не выходит.
Укажите направление пожалуйста!!!
PS с языком программирования знаком суток 5, изучал все с нуля, так что не ругайтесь.
Согласно вашей логике при отсутствии нажатия определенное время должны гореть 16 желтых св-диодов? Решите вопрос на аппаратном уровне, объедините св-диоды в логическое ИЛИ и выход подайте на пищалку
ЗЫ за знакомство с языком я отсидел реальных двое суток :)
ОК. Сейчас подробно обрисую ситуацию и выложу код программы, который имею.
Попробую более подробно описать ситуацию...
Я фермер, занимаюсь выращиванием зерновых культур, одной из таковых является хорошо знакомая всем пшеница. Данная культура высевается зерновыми сеялками. Обрисую весь процесс: семена засыпаются в бункер, через сужение они пападают в высевающий аппарат, цель которого дозировтаь норму семян, далее семена через воронку попадают в семяпровод - это условно круглый шланг по которому сыпятся семена для дальнейшей заделки в почву. Бункер большой и один, а к нему по ширине подсоединено 16 высевающих аппаратов. Выкладываю схематическое и фактические изображения сеялки:
Во времена СССР во время посева на сеялке находился сеяльщик, который визуально следил за процессом работы сеялки. Семена в сеялке в виду многих причин имеют свойство образовывать заторы, они бывают либо в бункере перед попаданием в высевающий аппарат - там сужение, либов в семяпроводе. сеялщик следил за данными заторами и устранял их. Но в наше время мало кто хочет стоять в пыли и грязи, поэтому на смену сеяльщикам пришла электроника - Система контроля высева, которая стоит приличных денег, да и не на все сеялки она подойдет. Так вот и загорялся я идеей при помощи ардуино зделать простую систему контроля высева.
Аппаратная часть состоит из ардуино Мега, по числу высевающих аппаратов - 16 оптических датчиков, 16 красных светодиодов, 16 желтых светодиодов и одной пищалки. Оптический датчик крепится на воронке, в месте указанном на схеме и фиксирует поток семян. Эксперимент на практике я проводил с помошью датчика и реле - датчик реагирует на поток семян и очень часто моргает, так как за секунду через зону его чувствительности проходит примерно 60-70 семян.
Алгоритм следующий:
Если затор образовался в семяпроводе, то семена наполняют его и закрывают датчик - датчик подает непрерывный сигнал.Если с оптического датчика высевающего аппарата "А" поступает сигнал, то засекаем время непрерывного сигнала, если оно превышает уставовленный параметр, то выводим сигнал на красный светодиод данного высевающего аппарата и общий зуммер.
Если затор образовался в бункере перед входом в высевающий аппарат, то зерно перестает сыпатся в воронку через датчик и тот не подает ни каких сигналов. Если с оптического датчика высевающего аппарата "А" не поступает сишнал, то засекаем время отсутствия сигнала, если оно превышает установленный параметр, то выодим сигнал на желтый светодиод данного высевающего аппарата и общий зуммер.
Другими словами сигнал должен иметь прерывание с частотой в заданных рамках
и такой алгоритм на каждый высевающий аппарат, так как они полностью независимы. А вот Зуммер один.
Написать скетч по диодам у меня получилось, в эмулятрое Virtual Breadboard все работает как часы, а вот с общим зуммером беда прям. то в бесконечный цикл впадает, то не гаснет, то не загорается, и переменные вводил и функиции.
Выложил код, на 4 датчика. Посоветуйте пожалуйста, как мне заставить работать зуммер, можно-ли оптимизировать код?
Спасибо.
import muvium.compatibility.arduino.*; public class a extends Arduino{ int ZUM = 0; //зуммер int IN1 = 1; // вход от оптического датчика 1-го высевающего аппарата int IN2 = 2;// вход от оптического датчика 2-го высевающего аппарата int IN3 = 3;// вход от оптического датчика 3-го высевающего аппарата int IN4 = 4;// вход от оптического датчика 4-го высевающего аппарата int LEDRED1 = 5; // выход на 1-й красный светодиод при образовании затора в семяпроводе 1-го высевающего аппарата int LEDRED2 = 6;// выход на 2-й красный светодиод при образовании затора в семяпроводе 2-го высевающего аппарата int LEDRED3 = 7;// выход на 3-й красный светодиод при образовании затора в семяпроводе 3-го высевающего аппарата int LEDRED4 = 8;// выход на 4-й красный светодиод при образовании затора в семяпроводе 4-го высевающего аппарата int LEDYELLOW1 = 9; // выходы на 1-й желтый светодиод при образовании затора в бункере 1-го высевающего аппарата int LEDYELLOW2 = 10; // выходы на 2-й желтый светодиод при образовании затора в бункере 2-го высевающего аппарата int LEDYELLOW3 = 11;// выходы на 3-й желтый светодиод при образовании затора в бункере 3-го высевающего аппарата int LEDYELLOW4 = 12;// выходы на 4- й желтый светодиод при образовании затора в бункере 4-го высевающего аппарата int MINTIMEHIGH = 1000; // время непрерывно поступающего сигнала от оптического датчика, при заторе в любом семяпроводе int MINTIMELOW = 500; // время отсутствия сигнала от оптического датчика, при заторе в бункере семян long TIMELOW1; // переменная для отсчета времени отсутствия сигнала 1- го высевающего аппарата long TIMEHIGH1; // переменная для отсчета времени непрерывного сигнала, 1- го высевающего аппарата long TIMELOW2; // переменная для отсчета времени отсутствия сигнала 2- го высевающего аппарата long TIMEHIGH2; // переменная для отсчета времени непрерывного сигнала, 2- го высевающего аппарата long TIMELOW3; // переменная для отсчета времени отсутствия сигнала 3- го высевающего аппарата long TIMEHIGH3; // переменная для отсчета времени непрерывного сигнала, 3- го высевающего аппарата long TIMELOW4; // переменная для отсчета времени отсутствия сигнала 4- го высевающего аппарата long TIMEHIGH4; // переменная для отсчета времени непрерывного сигнала, 4- го высевающего аппарата public void setup(){ // обозначаем входы/выходы pinMode(ZUM, OUTPUT); pinMode(IN1, INPUT); pinMode(IN2, INPUT); pinMode(IN3, INPUT); pinMode(IN4, INPUT); pinMode(LEDRED1, OUTPUT); pinMode(LEDRED2, OUTPUT); pinMode(LEDRED3, OUTPUT); pinMode(LEDRED4, OUTPUT); pinMode(LEDYELLOW1, OUTPUT); pinMode(LEDYELLOW2, OUTPUT); pinMode(LEDYELLOW3, OUTPUT); pinMode(LEDYELLOW4, OUTPUT); } public void loop(){ // 1-й высевающий аппарат if (digitalRead(IN1) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW1 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED1, LOW);} // обнуляем сигнал на красный светодиод if(millis() - TIMELOW1 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED1, HIGH); //то зажигаем красный светодиод TIMELOW1 = 0;}// обнуляем переменную if (digitalRead(IN1) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH1 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW1, LOW);} // обнуляем сигнал на желтый светодиод if(millis() - TIMEHIGH1 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW1, HIGH); //то зажигаем красный светодиод TIMEHIGH1 = 0;}// обнуляем переменную // по идее в циклах выходы на красном и желтом светодиодах должны быть поменяны местами, //но при прогонке программы через эмулятор Virtual Breadboard именно в такой расстановке все работает // 2-й высевающий аппарат if (digitalRead(IN2) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW2 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED2, LOW);} // обнуляем сигнал на красный светодиод if(millis() - TIMELOW2 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED2, HIGH); //то зажигаем красный светодиод TIMELOW2 = 0;}// обнуляем переменную if (digitalRead(IN2) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH2 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW2, LOW);} // обнуляем сигнал на желтый светодиод if(millis() - TIMEHIGH2 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW2, HIGH); //то зажигаем красный светодиод TIMEHIGH2 = 0;}// обнуляем переменную // 3-й высевающий аппарат if (digitalRead(IN3) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW3 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED3, LOW);} // обнуляем сигнал на красный светодиод if(millis() - TIMELOW3 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED3, HIGH); //то зажигаем красный светодиод TIMELOW3 = 0;}// обнуляем переменную if (digitalRead(IN3) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH3 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW3, LOW);} // обнуляем сигнал на желтый светодиод if(millis() - TIMEHIGH3 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW3, HIGH); //то зажигаем красный светодиод TIMEHIGH3 = 0;}// обнуляем переменную // 4-й высевающий аппарат if (digitalRead(IN4) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW4 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED4, LOW);} // обнуляем сигнал на красный светодиод if(millis() - TIMELOW4 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED4, HIGH); //то зажигаем красный светодиод TIMELOW4 = 0;}// обнуляем переменную if (digitalRead(IN4) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH4 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW4, LOW);} // обнуляем сигнал на желтый светодиод if(millis() - TIMEHIGH4 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW4, HIGH); //то зажигаем красный светодиод TIMEHIGH4 = 0;}// обнуляем переменную }}Добавь переменную, которой присваивай, при возникновении необходимости пищать, текущее время + время пищания пищалки и включай пищалку. В конце цикла сравнивай запомненное время и текущее. Если текущее больше, выключай пищалку.
С предыдущим оратором согласен. Оптимизировать можно - массивами и циклами. Мега тут не нужна, всё влезет во что угодно, даже в Mini, только нужно слегонца "увеличить" аппаратными решениями количество выводов под индикаторы.
При загорании любого из 32 светодиодов должна срабатывать пищалка.
Ну, так и делайте. Выделите "загорание" в отдельную фнукцию с однм параметром - номер пина светодиода. Везде вместо digitalWrite(NNN, HIGH); вызывайте своб функцию. А уж внутри этой функции включайте пищалку. И ничего ни с каким заморочками мудрить не надо.
Вроде получилось. Сделал просто. Присвоил дополнительные переменные и в случае загорания светодиода присваивал им 1, потом суммировал их и если сумма больше 1 то запускал пищалку
import muvium.compatibility.arduino.*; public class a extends Arduino{ int ZUM = 0; //зуммер int IN1 = 1; // вход от оптического датчика 1-го высевающего аппарата int IN2 = 2;// вход от оптического датчика 2-го высевающего аппарата int IN3 = 3;// вход от оптического датчика 3-го высевающего аппарата int IN4 = 4;// вход от оптического датчика 4-го высевающего аппарата int LEDRED1 = 5; // выход на 1-й красный светодиод при образовании затора в семяпроводе 1-го высевающего аппарата int LEDRED2 = 6;// выход на 2-й красный светодиод при образовании затора в семяпроводе 2-го высевающего аппарата int LEDRED3 = 7;// выход на 3-й красный светодиод при образовании затора в семяпроводе 3-го высевающего аппарата int LEDRED4 = 8;// выход на 4-й красный светодиод при образовании затора в семяпроводе 4-го высевающего аппарата int LEDYELLOW1 = 9; // выходы на 1-й желтый светодиод при образовании затора в бункере 1-го высевающего аппарата int LEDYELLOW2 = 10; // выходы на 2-й желтый светодиод при образовании затора в бункере 2-го высевающего аппарата int LEDYELLOW3 = 11;// выходы на 3-й желтый светодиод при образовании затора в бункере 3-го высевающего аппарата int LEDYELLOW4 = 12;// выходы на 4- й желтый светодиод при образовании затора в бункере 4-го высевающего аппарата int MINTIMEHIGH = 1000; // время непрерывно поступающего сигнала от оптического датчика, при заторе в любом семяпроводе int MINTIMELOW = 500; // время отсутствия сигнала от оптического датчика, при заторе в бункере семян long TIMELOW1; // переменная для отсчета времени отсутствия сигнала 1- го высевающего аппарата long TIMEHIGH1; // переменная для отсчета времени непрерывного сигнала, 1- го высевающего аппарата long TIMELOW2; // переменная для отсчета времени отсутствия сигнала 2- го высевающего аппарата long TIMEHIGH2; // переменная для отсчета времени непрерывного сигнала, 2- го высевающего аппарата long TIMELOW3; // переменная для отсчета времени отсутствия сигнала 3- го высевающего аппарата long TIMEHIGH3; // переменная для отсчета времени непрерывного сигнала, 3- го высевающего аппарата long TIMELOW4; // переменная для отсчета времени отсутствия сигнала 4- го высевающего аппарата long TIMEHIGH4; // переменная для отсчета времени непрерывного сигнала, 4- го высевающего аппарата long RED1; // переменная для включения зуммера от красного светодиода 1-го высевающего аппарата long YELLOW1;// переменная для включения зуммера от желтого светодиода 1-го высевающего аппарата long RED2;// переменная для включения зуммера от красного светодиода 2-го высевающего аппарата long YELLOW2;// переменная для включения зуммера от желтого светодиода 2-го высевающего аппарата long RED3;// переменная для включения зуммера от красного светодиода 3-го высевающего аппарата long YELLOW3;// переменная для включения зуммера от желтого светодиода 3-го высевающего аппарата long RED4;// переменная для включения зуммера от красного светодиода 4-го высевающего аппарата long YELLOW4;// переменная для включения зуммера от желтого светодиода 4-го высевающего аппарата public void setup(){ // обозначаем входы/выходы pinMode(ZUM, OUTPUT); pinMode(IN1, INPUT); pinMode(IN2, INPUT); pinMode(IN3, INPUT); pinMode(IN4, INPUT); pinMode(LEDRED1, OUTPUT); pinMode(LEDRED2, OUTPUT); pinMode(LEDRED3, OUTPUT); pinMode(LEDRED4, OUTPUT); pinMode(LEDYELLOW1, OUTPUT); pinMode(LEDYELLOW2, OUTPUT); pinMode(LEDYELLOW3, OUTPUT); pinMode(LEDYELLOW4, OUTPUT); } public void loop(){ // 1-й высевающий аппарат if (digitalRead(IN1) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW1 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED1, LOW);// обнуляем сигнал на красный светодиод RED1 = 0;} // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW1 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED1, HIGH); //то зажигаем красный светодиод RED1 = 1;//присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW1 = 0;}// обнуляем переменную if (digitalRead(IN1) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH1 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW1, LOW);// обнуляем сигнал на желтый светодиод YELLOW1 = 0;} // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH1 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW1, HIGH); //то зажигаем желтый светодиод YELLOW1 = 1;//присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH1 = 0;}// обнуляем переменную // по идее в циклах выходы на красном и желтом светодиодах должны быть поменяны местами, //но при прогонке программы через эмулятор Virtual Breadboard именно в такой расстановке все работает // 2-й высевающий аппарат if (digitalRead(IN2) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW2 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED2, LOW);// обнуляем сигнал на красный светодиод RED2 = 0;} // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW2 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED2, HIGH); //то зажигаем красный светодиод RED2 = 1;// присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW2 = 0;}// обнуляем переменную if (digitalRead(IN2) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH2 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW2, LOW);// обнуляем сигнал на желтый светодиод YELLOW2 = 0;} // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH2 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW2, HIGH); //то зажигаем желтый светодиод YELLOW2 = 1;// присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH2 = 0;}// обнуляем переменную // 3-й высевающий аппарат if (digitalRead(IN3) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW3 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED3, LOW);// обнуляем сигнал на красный светодиод RED3 = 0;} // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW3 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED3, HIGH); //то зажигаем красный светодиод RED3 = 1;// присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW3 = 0;}// обнуляем переменную if (digitalRead(IN3) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH3 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW3, LOW);// обнуляем сигнал на желтый светодиод YELLOW3 = 0;} // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH3 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW3, HIGH); //то зажигаем желтый светодиод YELLOW3 = 1;// присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH3 = 0;}// обнуляем переменную // 4-й высевающий аппарат if (digitalRead(IN4) == LOW) //если сигнал с оптического датчика отсутствует {TIMELOW4 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED4, LOW);// обнуляем сигнал на красный светодиод RED4 = 0;} // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW4 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED4, HIGH); //то зажигаем красный светодиод RED4 = 1;// присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW4 = 0;}// обнуляем переменную if (digitalRead(IN4) == HIGH) //если сигнал с оптического датчика присутствует {TIMEHIGH4 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW4, LOW);// обнуляем сигнал на желтый светодиод YELLOW4 = 0;} // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH4 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW4, HIGH); //то зажигаем желтый светодиод YELLOW4 = 1;// присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH4 = 0;}// обнуляем переменную // Срабатывание зуммера if(RED1 + YELLOW1+RED2 + YELLOW2+RED3 + YELLOW3+RED4 + YELLOW4 > 0) // если сумма всех переменных больше 0 {digitalWrite(ZUM, HIGH);} // врубаем зуммер else {digitalWrite(ZUM, LOW);} // вырубаем зуммер }}Это даже не через жопу гланды, это через разрез на пятке...
Я знаком с языком программирования 5 дней, и то вечерами сижу. Мне некогда углубляться и эксперементировать, мне важен был результат, так как это не хобби и времени у меня на это нет. Результата я добился и сэкономил 150 000 - именно столько стоит система контроля высева у диллера. Вот такие пирожки
Уважаю. Теперь предстоит заставить работать это в полевых условиях.
Уважаю. Теперь предстоит заставить работать это в полевых условиях.
Попрошу без оскорблений, умный человек. Я уже ни у кого ни чего не прошу. Сам решил свой вопрос.
По ходу здесь в большинстве своем умники, которые чисто поржать да постебаться над другими собрались.
Когда меня просят о помощи не владеющие знанием в моем направлении люди, я с удовольствием помогаю, а не стебаюсь и не умничаю. Даю дельные конкретные советы и указываю аргументированно на конкретные недостатки.
Хотя что я.... Вам 18 хоть стукнуло, ведь стиль речи определяет возрастные рамки не выше 16. Взрослые и серьезные люди так не разговаривают.
А вы не знаете специфики данной области, как я вижу. Вот вы перед тем, как дельный совет дать, выезжаете на чужое поле, засеваете-растите и жнете? В программировании именно так все и происходит - для того, чтобы дать дельный совет - нужно все самому сначала сделать и смоделировать, иначе это не совет будет, а посыл... в библиотеку.
Видите , зерновые люди начали выращивать давно. Давно начали вводить механизацию в посев. Опять же сеялки тоже появились не вчера. И убрать человека с сеялки тоже не вчера пытались. Опять же электроника, появилась не вчера. И опять же она тоже развивалась. А теперь для дедушки-ага, почему ему приходится заниматься этим. Видно из всего человечества только дедушка остался самым мудрым, но все же впал в МАРАЗМ. Потому что если бы МАРАЗМ не съел его мозг, то давно понял, что в зерне есть пыль. И эта пыль не только делает работу на сеялке неприятной, но и забивает все датчики. А вашу электронику покроет такой пылью, что заскопки Трои станут обычной рутиной.
Добрый день, подскажите тип оптического датчика который вы использовали. (т.к. такая проблема есть у знакомых, на старых сеялках при развороте было видно сеет или не сеет сошник, а на новой все закрыто и видно только через несколько недель в поле по всходам ))) и было такое что наверно с утра забился один сошник и только вечером обнаружили)
Скажите пожалуйста а зачем нужно 32 светодиода? Я так понимаю что если любой из них загорится, то нужно останавливаться и устранять затор. Если это так то хватит и двух диодов - красного и желтого или нужно знать конкретный бункер?
он все правилно делает, надо к краю доехать и что бы система сама показала какой сошник забит
32 светодиода необходимы, для того чтобы видеть какой именно выесевающий аппарат не работает
16 высевающих аппаратов, по 2 светодиода на каждый высевающий - красный и желтый. Красный если забился семяпровод и желтый - если отсутствует подача семян. При срабатывании механизатор будет знать, с каким высевающим и что случилось, в итоге экономия времни. А то загориться один свеодиод и пойди гадай, что да где сработало.
Система должна чработать через несколько секунд или минут после закупорки зерна, как настроишь
Скетч написать это плевая задача. Но реальность она не только в написании скетча. Узкий вопрос сеялок это оптическая система, которая банально забиватся пылью. Так что датчик помещается в пылезащищеный корпус. Но если сделать защитное стекло, то через некоторое время оно покроется пылью. А если сделать длиную трубку, то поработает дольше, но через некоторое время забъется грязью и перестанет показвать. Подведем итог: убирая человека с сеялки мы создаем рабочее место для чистильщика и сменщика оптических датчиков на сеялке. И у этого человека должна быть квалификация повыше и денег возьмет побольше. Хотя может обслуживать больше сеялок.
Я знаю что это будет не легко, поверте мне и не такие проблемы решали. Бюджет 3 тысячи, так что стоит попробывать. Вся аппаратная чать будет находится в тракторе в герметичном корпусе с отдельным преобразователем напряжения, а в тракторе чисто и кондеры стоят- не как раньше было. На сеялке будут стоять только датчики, а именное сами передатчи и приемник сигнала. Да возможно запыление датчиков, но пару раз в день пробежаться и тряпочкой протереть, думаю минуты 3-5 займет. Все равно заправки семенами и удобрениями раз 2 часа. В общем я понимаю что сразу все гладко не пойдет, будут доработки, переделки, главное желание...
Думаю овчинка выделки стоит, так как проблема с пропусками серьезная, от этого потери урожая большие.
типично русский ГиП. Смиялсо.
По теме запыления. Датчики хорошо встают там, где будет непосредственный контакт зерна и преимников-передатчиков сигнала, а зерно хороший шлифовачный материал. По маршруту хода зерна всегда идеально чисто, грязь там, где оно не текет. Вот от этого и будем плясать....
Писсимист ищет проблему, а оптимист - решение...
Оптический обычный колхозный китайский.
В инете полно профессиональных датчиков для различного рода Систем контроля высева
Вот так выглядят датчики, даже на мой взгяд далекий от с/х http://www.dnepragro.com/datchik-kontrolya-vyseva/
ты шо, Винни, это дорахо...
ты шо, Винни, это дорахо...
Типичный датчик на СКВ, крепится на семяпровод, семяпроводы полиэтиленовые и пропускают сигнал.
Но у меня другая сеялка в воронку сыпятся и с одного края семена, с другого удобрения, в семяпроводе они уже сыпятся вместе и система не сработает в случае отказа по семенам, так как удобрения будут давать сигнал. На импортных сеялках система другая.
ты шо, Винни, это дорахо...
Я и не уверждаю что все получится на 100%%, но потерь ни каких...
PS а посмотри пожалуйста, где твой ноут и телефон собраны
Вот посмотрите на два датчика - если подойдет поаналогии можно размножить
#define led0_Y 4 #define led0_R 5 #define led1_Y 6 #define led1_R 7 #define buser 13 bool push0, temp_push0; bool push1, temp_push1; //Переменные функции паузы или дребезга, с разным временем опроса unsigned long currentPause[16]; //массив данных. Количество элементов - количеству таймеров bool fl_pause[16];//массив данных. Количество элементов - количеству таймеров //Функция дребезга или паузы (time-время задержки, nomer-номер таймера) boolean my_pausa(unsigned long time, byte nomer) { bool x = 0; if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1; if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0; return x; } void setup() { pinMode(2, INPUT_PULLUP); //Первый датчик pinMode(3, INPUT_PULLUP); //Второй датчик pinMode(led0_Y, OUTPUT); //Желтый pinMode(led0_R, OUTPUT); //Красный pinMode(led1_Y, OUTPUT); // pinMode(led1_R, OUTPUT); pinMode(buser, OUTPUT); // } void loop() { push0 = digitalRead(2);//Читаем датчик 1 push1 = digitalRead(3);//Читаем датчик 2 //Обработка первого датчика if (temp_push0 != push0) { //Если все нормально temp_push0 = push0; fl_pause[0] = 0; //Засекаем время digitalWrite(led0_R, LOW ); digitalWrite(led0_Y, LOW ); digitalWrite(buser, LOW ); } else { //Есть проблема if (push0) { if (my_pausa(1000, 0))digitalWrite(led0_Y, HIGH ); //Время больше- включаем желтый } else { if (!push0) { if (my_pausa(500, 0)) { // Время больше- включаем красный и звук digitalWrite(led0_R, HIGH ); digitalWrite(buser, HIGH ); } } } } //Обработка Второго датчика if (temp_push1 != push1) { temp_push1 = push1; fl_pause[1] = 0; //Засекаем время digitalWrite(led1_R, LOW ); digitalWrite(led1_Y, LOW ); digitalWrite(buser, LOW ); } else { if (push1) { if (my_pausa(1000, 1))digitalWrite(led1_Y, HIGH ); //Время больше- включаем желтый } else { if (!push1) { if (my_pausa(500, 1)) { // Время больше- включаем красный и звук digitalWrite(led1_R, HIGH ); digitalWrite(buser, HIGH ); } } } } }[quote=vosara]
Вот посмотрите на два датчика - если подойдет поаналогии можно размножить
Спасибо БОЛЬШОЕ, обязательно попробую
Результата я добился и сэкономил 150 000 - именно столько стоит система контроля высева у диллера. Вот такие пирожки
Хреновые пирожки. Можно было не лохматить бабушку, и сэкономить 100 тысяч, заказав за 50 (максимум) нормальное качественное исполнение. Впрочем, раз вы довольны - ну и ладушки.
типично русский ГиП. Смиялсо.
Во, и я о том же подумал. На все руки мастера эти гусские, только почему-то в стране папуасия.
типично русский ГиП. Смиялсо.
Во, и я о том же подумал. На все руки мастера эти гусские, только почему-то в стране папуасия.
Еще раз повторяю, для моей марки сеялки Системы контроля высева не производятся, так как она механическая и высевающий аппарат комбинирован с туковым аппаратом - т.е. параллельным высевом удобрений.
Все импортные и отечественные посевные комплексы нового поколения пневматические с раздельными бункерами, там система высева другая - туда и идут все системы контроля высева. На мои площади такие комплексы не нужны.
По поводу цены. Выкладываю фото Системы контроля высева под названием ДаринаУ, для пропашных сеялок (посев семечек, кукурузы), которую тоже по идее надо покупать. Она стоит 50 000!!! Вы посмотрите, разве это может стоить 50 000??? импортные идут от 130 000, самая дешевая Украинская Нива за 47 и то на пропашную сеялку. Я более чес уверен, что там ардуино внутри сидит.
На Зерновые сеялки с 16 высевающими аппаратами как у меня система контроля высева Скиф стоит примерно 147 тысяч. Их тоже модификаций полно. Так что приходится кому в попуасии, а кому на Родине рассматривать все варианты. Тем более сейчас зима, сижу дома, время до всены есть, почему бы не заняться.
Предполагаю код из 10 поста крайний?
Просто перечислю, а там сам смотри. Вообще и тебе, и другим кто смотрит твой код будет проще
1. Пины объявляй через define
2. Структурируй, чтообы глазу было за что зацепится, проще будет читать код
3. Однотипные и структурно одинаковые переменные можно объявлять группами
Насколько терпения хватило поправил))
#define ZUM 0 //зуммер //============================Вход оптического датчика=============================== #define IN1 1 // 1-го высевающего аппарата #define IN2 2 // 2-го высевающего аппарата #define IN3 3 // 3-го высевающего аппарата #define IN4 4 // 4-го высевающего аппарата //======================Выход на красный светодиод в семяпроводе===================== #define LEDRED1 5 // 1-го высевающего аппарата #define LEDRED2 6 // 2-го высевающего аппарата #define LEDRED3 7 // 3-го высевающего аппарата #define LEDRED4 8 // 4-го высевающего аппарата //======================Выход на желтый светодиод в семяпроводе====================== #define LEDYELLOW1 9 // 1-го высевающего аппарата #define LEDYELLOW2 10 // 2-го высевающего аппарата #define LEDYELLOW3 11 // 3-го высевающего аппарата #define LEDYELLOW4 12 // 4-го высевающего аппарата #define MINTIMEHIGH 1000 // время непрерывно поступающего сигнала от оптического датчика, при заторе в любом семяпроводе #define MINTIMELOW 500 // время отсутствия сигнала от оптического датчика, при заторе в бункере семян //===============Переменные для отсчета времени отсутствия сигнала=================== long TIMELOW1, TIMELOW2, TIMELOW3, TIMELOW4; // 1, 2, 3, 4 - го высевающего аппарата //===============Переменные для отсчета времени непрерывного сигнала================= long TIMEHIGH1, TIMEHIGH2, TIMEHIGH3, TIMEHIGH4; // 1, 2, 3, 4 - го высевающего аппарата //=============Переменные для включения зуммера от красного светодиода=============== long RED1, RED2, RED3, RED4; // 1, 2, 3, 4 - го высевающего аппарата //=============Переменные для включения зуммера от желтого светодиода================ long YELLOW1, YELLOW2, YELLOW3, YELLOW4; // 1, 2, 3, 4 - го высевающего аппарата void setup(){ // обозначаем входы/выходы pinMode(ZUM, OUTPUT); pinMode(IN1, INPUT); pinMode(IN2, INPUT); pinMode(IN3, INPUT); pinMode(IN4, INPUT); pinMode(LEDRED1, OUTPUT); pinMode(LEDRED2, OUTPUT); pinMode(LEDRED3, OUTPUT); pinMode(LEDRED4, OUTPUT); pinMode(LEDYELLOW1, OUTPUT); pinMode(LEDYELLOW2, OUTPUT); pinMode(LEDYELLOW3, OUTPUT); pinMode(LEDYELLOW4, OUTPUT); } void loop(){ // 1-й высевающий аппарат if (digitalRead(IN1) == LOW){ //если сигнал с оптического датчика отсутствует TIMELOW1 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED1, LOW);// обнуляем сигнал на красный светодиод RED1 = 0; } // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW1 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED1, HIGH); //то зажигаем красный светодиод RED1 = 1;//присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW1 = 0; }// обнуляем переменную if (digitalRead(IN1) == HIGH) //если сигнал с оптического датчика присутствует { TIMEHIGH1 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW1, LOW);// обнуляем сигнал на желтый светодиод YELLOW1 = 0; } // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH1 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW1, HIGH); //то зажигаем желтый светодиод YELLOW1 = 1;//присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH1 = 0; }// обнуляем переменную // по идее в циклах выходы на красном и желтом светодиодах должны быть поменяны местами, //но при прогонке программы через эмулятор Virtual Breadboard именно в такой расстановке все работает // 2-й высевающий аппарат if (digitalRead(IN2) == LOW) //если сигнал с оптического датчика отсутствует { TIMELOW2 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED2, LOW);// обнуляем сигнал на красный светодиод RED2 = 0; } // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW2 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED2, HIGH); //то зажигаем красный светодиод RED2 = 1;// присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW2 = 0; }// обнуляем переменную if (digitalRead(IN2) == HIGH) //если сигнал с оптического датчика присутствует { TIMEHIGH2 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW2, LOW);// обнуляем сигнал на желтый светодиод YELLOW2 = 0; } // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH2 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW2, HIGH); //то зажигаем желтый светодиод YELLOW2 = 1;// присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH2 = 0; }// обнуляем переменную // 3-й высевающий аппарат if (digitalRead(IN3) == LOW) //если сигнал с оптического датчика отсутствует { TIMELOW3 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED3, LOW);// обнуляем сигнал на красный светодиод RED3 = 0; } // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW3 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED3, HIGH); //то зажигаем красный светодиод RED3 = 1;// присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW3 = 0; }// обнуляем переменную if (digitalRead(IN3) == HIGH) //если сигнал с оптического датчика присутствует { TIMEHIGH3 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW3, LOW);// обнуляем сигнал на желтый светодиод YELLOW3 = 0; } // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH3 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW3, HIGH); //то зажигаем желтый светодиод YELLOW3 = 1;// присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH3 = 0; }// обнуляем переменную // 4-й высевающий аппарат if (digitalRead(IN4) == LOW) //если сигнал с оптического датчика отсутствует { TIMELOW4 = millis(); // то начинаем отсчет времени отсутствия данного сигнала digitalWrite(LEDRED4, LOW);// обнуляем сигнал на красный светодиод RED4 = 0; } // присваевываем 0 переменной зуммера включающегося от красного светодиода if(millis() - TIMELOW4 > MINTIMELOW){ // если прошедшее время с момента начала остутствия сигнала превышает заданное digitalWrite(LEDRED4, HIGH); //то зажигаем красный светодиод RED4 = 1;// присваевываем 1 переменной зуммера включающегося от красного светодиода TIMELOW4 = 0; }// обнуляем переменную if (digitalRead(IN4) == HIGH) //если сигнал с оптического датчика присутствует { TIMEHIGH4 = millis(); // то начинаем отсчет времени присутствия данного сигнала digitalWrite(LEDYELLOW4, LOW);// обнуляем сигнал на желтый светодиод YELLOW4 = 0; } // присваевываем 0 переменной зуммера включающегося от желтого светодиода if(millis() - TIMEHIGH4 > MINTIMEHIGH){ // если прошедшее время с момента начала присутствия сигнала превышает заданное digitalWrite(LEDYELLOW4, HIGH); //то зажигаем желтый светодиод YELLOW4 = 1;// присваевываем 1 переменной зуммера включающегося от желтого светодиода TIMEHIGH4 = 0; }// обнуляем переменную // Срабатывание зуммера if(RED1 + YELLOW1+RED2 + YELLOW2+RED3 + YELLOW3+RED4 + YELLOW4 > 0) // если сумма всех переменных больше 0 { digitalWrite(ZUM, HIGH); } // врубаем зуммер else { digitalWrite(ZUM, LOW); } // вырубаем зуммер }Далее у тебя вроде абсолютно одинаковые куски кода в количестве 4 шт. Тогда пины и переменные объявить в массивы, у каждого типа свой. И цикл на 4 повторения, и внутри будет твой одинаковый код
самая дешевая Украинская Нива за 47
Это где такие цены? В Украине она стоит 8-8,5 тыс. грн. ( 16-17 тышшч деревянными). Может бизнес замутить, продавать их вам, скажем, по 30 ?
Я фигею от таких простыней...
Что, никто не слышал про массивы и циклы?
Применение классов в простейшем случае приводит к увеличению объема текста исходников. Снижение трудозатрат происходит лишь при эффективном использовании наследования и полиформизма.
А вот применение средств структурного программирования приводит к уменьшению трудозатрат практически всегда. Да и поддерживается в любом из современных ЯП в отличие от ООП.
Человек целых 5 ( а, нет, уже 6) дней в С крутица, а вы набросились, тролли. На 9-й день он до классов дайдеть.
самая дешевая Украинская Нива за 47
Это где такие цены? В Украине она стоит 8-8,5 тыс. грн. ( 16-17 тышшч деревянными). Может бизнес замутить, продавать их вам, скажем, по 30 ?
Ну так люди и мутят.Только не все так просто. Потенциальный покупатель в большинстве своем у кого попало брать не будет, только у диллера завода, имеющего сопровождение, и предоставляющего гарантию. Данный товар - не пирожки. Берут сезонно и штучно, так что оборот капиталла долгий. В итоге наценка идет порядка 100%. Ну и за 8,5 тыс гривен пологаю минимальная комплектация идет, там вроде есть без датчика скорости варианты и с датчиком скорости, который считает площадь.
jeka_tm Спасибо!!!
Вечером обязательно попробую!!!!
Вот тоже самое только по другому - на 3 датчика. Пробуйте
#define led0_Y 4 #define led0_R 5 #define led1_Y 6 #define led1_R 7 #define led2_Y 9 #define led2_R 10 #define buser 13 uint8_t led_Y[16] = {4, 6, 9}; //подставляем Ваши пины 16шт Желтый uint8_t led_R[16] = {5, 7, 10}; //подставляем Ваши пины 16шт красные uint8_t push[16]; uint8_t temp_push[16]; //Переменные функции паузы или дребезга, с разным временем опроса unsigned long currentPause[16]; //массив данных. Количество элементов - количеству таймеров bool fl_pause[16];//массив данных. Количество элементов - количеству таймеров //Функция дребезга или паузы (time-время задержки, nomer-номер таймера) boolean my_pausa(unsigned long time, byte nomer) { bool x = 0; if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1; if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0; return x; } // Функция проверки правильности работы void run (uint8_t value) { if (temp_push[value] != push[value]) { //Если все нормально temp_push[value] = push[value]; fl_pause[value] = 0; //Засекаем время digitalWrite(led_R[value], LOW ); Serial.println(led_R[value]); digitalWrite(led_Y[value], LOW ); digitalWrite(buser, LOW ); } else { //Есть проблема if (push[value]) { if (my_pausa(1000, value))digitalWrite(led_Y[value], HIGH ); //Время превысело - включаем желтый } else { if (!push[value]) { if (my_pausa(500, value)) { // Время превысело - включаем красный и звук digitalWrite(led_R[value], HIGH ); digitalWrite(buser, HIGH ); } } } } } void setup() //здесь все можно сделать через for { pinMode(2, INPUT_PULLUP); //Первый датчик pinMode(3, INPUT_PULLUP); //Второй датчик pinMode(8, INPUT_PULLUP); //3 датчик pinMode(led0_Y, OUTPUT); //Желтый pinMode(led0_R, OUTPUT); //Красный pinMode(led1_Y, OUTPUT); // pinMode(led1_R, OUTPUT); pinMode(led2_Y, OUTPUT); // pinMode(led2_R, OUTPUT); pinMode(buser, OUTPUT); // } void loop() { //здесь тоже все можно сделать через for push[0] = digitalRead(2);//Читаем датчик 1 run(0); // Проверяем правильность работы push[1] = digitalRead(3);//Читаем датчик 2 run(1); push[2] = digitalRead(8);//Читаем датчик 3 run(2); }vosara, добавьте третий массив для пинов датчиков, уберите все define кроме buser (buzzer?) и выполните собственные рекомендации в setup и loop.
Пусть человек сначала убедится что ему подходит, а потом он сам или поможем оптимизировать.
В сетуп я бы вообще DDR поставил, и вместо диодов можно использовать дисплей - хотябы 16х2. в первой строчке 16 брусков -желтые а вторая строчка красные, сколько пинов можно с экономить!!
А вот так начинается проектирование через классы. И опять вылезла проблема, на которую ТС забил. Вкл зумера есть. А вот вык кнопкой нет.
/**/ unsigned long mill; // переменная под millis() //-------------------------------- // класс сопло сеялки class Cl_DrillNozzle { protected: byte pin1, pin2, pin3; /*пины красный,желтой,кнопки*/ public: /*конструктор*/ Cl_DrillNozzle(byte p1, byte p2, byte p3) : pin1(p1), pin2(p2), pin3(p3) {} /*инициализация*/ void init() {} /*работа*/ void run() {} }; //---Компоновка----------------------------- Cl_DrillNozzle DR1(/*пин красный*/6,/*пин желтый*/A0,/*датчик*/2); Cl_DrillNozzle DR2(/*пин красный*/7,/*пин желтый*/A1,/*датчик*/3); Cl_DrillNozzle DR3(/*пин красный*/8,/*пин желтый*/A2,/*датчик*/4); Cl_DrillNozzle DR4(/*пин красный*/9,/*пин желтый*/A3,/*датчик*/5); //---main----------------------------- void setup() { DR1.init(); DR2.init(); DR3.init(); DR4.init(); } void loop() { mill = millis(); DR1.run(); DR2.run(); DR3.run(); DR4.run(); } /**/ПС: Почему я рекомендую писать через классы и пользуясь приемами ООП. Так легче выявлять и устранять косяки ТЗ. Но вот освоить эти навыки надо затратить много мозговых усилий. Что тяжко.