Срабатывание пищалки при загорании одного из нескольких светодиодов

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Здравствуйте!

Имею 32 светодиода, 16 кнопок, и один зуммер.

К каждой кнопке завязаны 2 светодиода - красный и желтый. При удерживании кнопки более определенного времени загорается красный светодиод, при отсутствии нажатий определенное аремя - загорается желтый. Если нажимать кнопку в пределах определенного интервала времени - то ни один светодиод не загорится. 

И таких вот 16 независимых узлов.

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

При загорании любого из 32 светодиодов должна срабатывать пищалка.

Третьи сутки мучаюсь, и так и сяк пытаюсь и переменными и суммированием - не выходит.

Укажите направление пожалуйста!!!

PS  с языком программирования знаком суток 5, изучал все с нуля, так что не ругайтесь.

Заранее благодарен.

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вы в курсе, что экстрасенсы выступают на канале ТНТ, а не тут?

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Чудак! Это был намек, что код не выложен. И выкладывай про правилам форума.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Sbalakirev пишет:

Здравствуйте!

Имею 32 светодиода, 16 кнопок, и один зуммер.

К каждой кнопке завязаны 2 светодиода - красный и желтый. При удерживании кнопки более определенного времени загорается красный светодиод, при отсутствии нажатий определенное аремя - загорается желтый. Если нажимать кнопку в пределах определенного интервала времени - то ни один светодиод не загорится. 

И таких вот 16 независимых узлов.

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

При загорании любого из 32 светодиодов должна срабатывать пищалка.

Третьи сутки мучаюсь, и так и сяк пытаюсь и переменными и суммированием - не выходит.

Укажите направление пожалуйста!!!

PS  с языком программирования знаком суток 5, изучал все с нуля, так что не ругайтесь.

Согласно вашей логике при отсутствии нажатия определенное время должны гореть 16 желтых св-диодов? Решите вопрос на аппаратном уровне, объедините св-диоды в логическое ИЛИ и выход подайте  на пищалку

ЗЫ за знакомство с языком я отсидел реальных двое суток :)

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

ОК. Сейчас подробно обрисую ситуацию и выложу код программы, который имею.

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Попробую более подробно описать ситуацию...

Я фермер, занимаюсь выращиванием зерновых культур, одной из таковых является хорошо знакомая всем пшеница. Данная культура высевается зерновыми сеялками. Обрисую весь процесс: семена засыпаются в бункер, через сужение они пападают в высевающий аппарат, цель которого дозировтаь норму семян, далее семена через воронку попадают в семяпровод - это условно круглый шланг по которому сыпятся семена для дальнейшей заделки в почву. Бункер большой и один, а к нему по ширине подсоединено 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;}// обнуляем переменную	
	}}	
	

 

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Добавь переменную, которой присваивай, при возникновении необходимости пищать, текущее время + время пищания пищалки и включай пищалку. В конце цикла сравнивай  запомненное время и текущее. Если текущее больше, выключай пищалку. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

С предыдущим оратором согласен. Оптимизировать можно - массивами и циклами. Мега тут не нужна, всё влезет во что угодно, даже в Mini, только нужно слегонца "увеличить" аппаратными решениями количество выводов под индикаторы.

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

Sbalakirev пишет:

При загорании любого из 32 светодиодов должна срабатывать пищалка.

Ну, так и делайте. Выделите "загорание" в отдельную фнукцию с однм параметром - номер пина светодиода. Везде вместо digitalWrite(NNN, HIGH); вызывайте своб функцию. А уж внутри этой функции включайте пищалку. И ничего ни с каким заморочками мудрить не надо.

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Вроде получилось. Сделал просто. Присвоил дополнительные переменные и в случае загорания светодиода присваивал им 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);} // вырубаем зуммер
	}}	

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Это даже не через жопу гланды, это через разрез на пятке...

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Я знаком с языком программирования 5 дней, и то вечерами сижу. Мне некогда углубляться и эксперементировать, мне важен был результат, так как это не хобби и времени у меня на это нет. Результата я добился и сэкономил 150 000 - именно столько стоит система контроля высева у диллера. Вот такие пирожки

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Уважаю. Теперь предстоит заставить работать это в полевых условиях. 

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

DetSimen пишет:

Уважаю. Теперь предстоит заставить работать это в полевых условиях. 

Если человек идиот, то это на долго. Человек решил сэкономить время и деньги на программировании(или изучении программирования) и вот результат.  Программист это не только человек который пишет программу, но и разрабатывает простую и надежную систему. Вот я сейчас заявлюсь и начну заниматься зерновыми и что? Ну времени у меня нет. Мол 5 дней как полез в книжки и потом заявлюсь на форум и попрошу мне помочь? 

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Попрошу без оскорблений, умный человек. Я уже ни у кого ни чего не прошу. Сам решил свой вопрос. 

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

Когда меня просят о помощи не владеющие знанием в моем направлении люди, я с удовольствием помогаю, а не стебаюсь и не умничаю. Даю дельные конкретные советы и указываю аргументированно  на конкретные недостатки. 

Хотя что я.... Вам 18 хоть стукнуло, ведь стиль речи определяет возрастные рамки не выше 16. Взрослые и серьезные люди так не разговаривают.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А вы не знаете специфики данной области, как я вижу. Вот вы перед тем, как дельный совет дать, выезжаете на чужое поле, засеваете-растите и жнете? В программировании именно так все и происходит - для того, чтобы дать дельный совет - нужно все самому сначала сделать и смоделировать, иначе это не совет будет, а посыл... в библиотеку. 

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

Видите , зерновые люди начали выращивать давно. Давно начали вводить механизацию в посев. Опять же сеялки тоже появились не вчера. И убрать человека с сеялки тоже не вчера пытались. Опять же электроника, появилась не вчера. И опять же она тоже развивалась. А теперь для дедушки-ага, почему ему приходится заниматься этим. Видно из всего человечества только дедушка остался самым мудрым, но все же впал в МАРАЗМ. Потому что если бы МАРАЗМ не съел его мозг, то давно понял, что в зерне есть пыль. И эта пыль не только делает работу на сеялке неприятной, но и забивает все датчики. А вашу электронику покроет такой пылью, что заскопки  Трои станут обычной рутиной.

mvn
Offline
Зарегистрирован: 25.05.2016

Добрый день, подскажите тип оптического датчика который вы использовали. (т.к. такая проблема есть у знакомых, на старых сеялках при развороте было видно сеет или не сеет сошник, а на новой все закрыто и видно только через несколько недель в поле по всходам ))) и было такое что наверно с утра забился один сошник и только вечером обнаружили) 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Скажите пожалуйста а зачем нужно 32 светодиода? Я так понимаю что если любой из них загорится, то нужно останавливаться и устранять затор. Если это так то хватит и двух диодов - красного и желтого или нужно знать конкретный бункер?

mvn
Offline
Зарегистрирован: 25.05.2016

он все правилно делает, надо к краю доехать и что бы система сама показала какой сошник забит

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

32 светодиода необходимы, для того чтобы видеть какой именно выесевающий аппарат не работает

16 высевающих аппаратов, по 2 светодиода на каждый высевающий - красный и желтый. Красный если забился семяпровод и желтый - если отсутствует подача семян. При срабатывании механизатор будет знать, с каким высевающим и что случилось, в итоге экономия времни. А то загориться один свеодиод и пойди гадай, что да где сработало.

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Система должна чработать через несколько секунд или минут после закупорки зерна, как настроишь

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

Скетч написать это плевая задача. Но реальность она не только в написании скетча. Узкий вопрос сеялок это оптическая система, которая банально забиватся пылью. Так что датчик помещается в пылезащищеный корпус. Но если сделать защитное стекло, то через некоторое время оно покроется пылью. А если сделать длиную трубку, то поработает дольше, но через некоторое время забъется грязью и перестанет показвать. Подведем итог: убирая человека с сеялки мы создаем рабочее место для чистильщика и сменщика оптических  датчиков на сеялке. И у этого человека должна быть квалификация повыше и денег возьмет побольше. Хотя может обслуживать больше сеялок. 

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Я знаю что это будет не легко, поверте мне и не такие проблемы решали. Бюджет 3 тысячи, так что стоит попробывать. Вся аппаратная чать будет находится в тракторе в герметичном корпусе с отдельным преобразователем напряжения, а в тракторе чисто и кондеры стоят- не как раньше было. На сеялке будут стоять только датчики, а именное сами передатчи и приемник сигнала. Да возможно запыление датчиков, но пару раз в день пробежаться и тряпочкой протереть, думаю минуты 3-5 займет. Все равно заправки семенами и удобрениями раз 2 часа. В общем я понимаю что сразу все гладко не пойдет, будут доработки, переделки, главное желание...

 

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

типично русский ГиП.  Смиялсо. 

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

По теме запыления. Датчики хорошо встают там, где будет непосредственный контакт зерна и преимников-передатчиков сигнала, а зерно хороший шлифовачный материал. По маршруту хода зерна всегда идеально чисто, грязь там, где оно не текет. Вот от этого и будем плясать....

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Писсимист ищет проблему, а оптимист - решение...

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

 

Оптический обычный колхозный китайский.

В инете полно профессиональных датчиков для различного рода Систем контроля высева

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

Вот так выглядят датчики, даже на мой взгяд далекий от с/х http://www.dnepragro.com/datchik-kontrolya-vyseva/

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты шо, Винни, это дорахо...

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

DetSimen пишет:

ты шо, Винни, это дорахо...

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

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

Типичный датчик на СКВ, крепится на семяпровод, семяпроводы полиэтиленовые и пропускают сигнал.

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

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

qwone пишет:

DetSimen пишет:

ты шо, Винни, это дорахо...

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

Я и не уверждаю что все получится на 100%%, но потерь ни каких...

PS а посмотри пожалуйста, где твой ноут и телефон собраны

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вот посмотрите на два датчика - если подойдет поаналогии можно размножить

#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 );
        }
      }
    }
  }
}

 

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

[quote=vosara]

Вот посмотрите на два датчика - если подойдет поаналогии можно размножить

Спасибо БОЛЬШОЕ, обязательно попробую


DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Sbalakirev пишет:

Результата я добился и сэкономил 150 000 - именно столько стоит система контроля высева у диллера. Вот такие пирожки

Хреновые пирожки. Можно было не лохматить бабушку, и сэкономить 100 тысяч, заказав за 50 (максимум)  нормальное качественное исполнение. Впрочем, раз вы довольны - ну и ладушки. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

типично русский ГиП.  Смиялсо. 

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

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

DIYMan пишет:

DetSimen пишет:

типично русский ГиП.  Смиялсо. 

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

Еще раз повторяю, для моей марки сеялки Системы контроля высева не производятся, так как она механическая и высевающий аппарат комбинирован с туковым аппаратом - т.е. параллельным высевом удобрений.

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

По поводу цены. Выкладываю фото Системы контроля высева под названием ДаринаУ, для пропашных сеялок (посев семечек, кукурузы), которую тоже по идее надо покупать. Она стоит 50 000!!! Вы посмотрите, разве это может стоить 50 000??? импортные идут от 130 000, самая дешевая Украинская Нива за 47 и то на пропашную сеялку. Я более чес уверен, что там ардуино внутри сидит.

На Зерновые сеялки с 16 высевающими аппаратами как у меня система контроля высева Скиф стоит примерно 147 тысяч. Их тоже модификаций полно. Так что приходится кому в попуасии, а кому на Родине рассматривать все варианты. Тем более сейчас зима, сижу дома, время до всены есть, почему бы не заняться.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Предполагаю код из 10 поста крайний?

Просто перечислю, а там сам смотри. Вообще и тебе, и другим кто смотрит твой код будет проще

1. Пины объявляй через define 

 было
int ZUM = 0; //зуммер

стало
#define ZUM 0 //зуммер

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 повторения, и внутри будет твой одинаковый код

gfx125
Offline
Зарегистрирован: 27.05.2017

Sbalakirev пишет:

самая дешевая Украинская Нива за 47

Это где такие цены? В Украине она стоит 8-8,5 тыс. грн. ( 16-17 тышшч деревянными). Может бизнес замутить, продавать их вам, скажем, по 30 ?

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

Я фигею от таких простыней...

Что, никто не слышал про массивы и циклы?

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

andriano пишет:
Что, никто не слышал про массивы и циклы?
А я фигею, что народ не в курсе про классы. Нарисовали один класс и размножили.

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

Применение классов в простейшем случае приводит к увеличению объема текста исходников. Снижение трудозатрат происходит лишь при эффективном использовании наследования и полиформизма. 

А вот применение средств структурного программирования приводит к уменьшению трудозатрат практически всегда. Да и поддерживается в любом из современных ЯП в отличие от ООП.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Человек целых 5 ( а, нет, уже 6) дней в С крутица, а вы набросились, тролли. На 9-й день он до классов дайдеть. 

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

gfx125 пишет:

Sbalakirev пишет:

самая дешевая Украинская Нива за 47

Это где такие цены? В Украине она стоит 8-8,5 тыс. грн. ( 16-17 тышшч деревянными). Может бизнес замутить, продавать их вам, скажем, по 30 ?

Ну так люди и мутят.Только не все так просто. Потенциальный покупатель в большинстве своем у кого попало брать не будет, только у диллера завода, имеющего сопровождение, и предоставляющего гарантию. Данный товар - не пирожки. Берут сезонно и штучно, так что оборот капиталла долгий. В итоге наценка идет порядка 100%. Ну и за 8,5 тыс гривен пологаю минимальная комплектация идет, там вроде есть без датчика скорости варианты и с датчиком скорости, который считает площадь. 

 

Sbalakirev
Offline
Зарегистрирован: 23.12.2017

jeka_tm Спасибо!!!

Вечером обязательно попробую!!!!

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вот тоже самое только по другому - на 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);


}

 

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

vosara, добавьте третий массив для пинов датчиков, уберите все define кроме buser (buzzer?) и выполните собственные рекомендации в setup и loop.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пусть человек сначала убедится что ему подходит, а потом он сам или поможем оптимизировать.

В сетуп я бы вообще  DDR поставил, и вместо диодов можно использовать дисплей - хотябы 16х2. в первой строчке 16 брусков -желтые  а вторая строчка красные, сколько пинов можно с экономить!!

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

А вот так начинается проектирование через классы. И опять вылезла проблема, на которую ТС забил. Вкл зумера есть. А вот вык кнопкой нет.

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

 

ПС: Почему я рекомендую писать через классы и пользуясь приемами ООП. Так легче выявлять и устранять косяки ТЗ. Но вот освоить эти навыки надо затратить много мозговых усилий. Что тяжко.