Реально ли дописать скетч?

Prokl
Offline
Зарегистрирован: 25.11.2018

Прога не моя, автор не откликается. Вопрос: можно ли дописать её или нужно все начинать с чистого листа? Смысл в том что бы отключать пусковые конденсаторы электродвигателя по достижению определенных оборотов. 

Например:  от 0 до 1000 оборотов реле включено, от 1000 и больше выключено. Как понимаете раз я задаю подобные вопросы, значит я далек от програмирования чего либо, так же как Валуев от квантовой физики... По этому прошу не кидаться тапками.

Ни чего подобного в сети не нашел, а тема по настоящему интересная и необходимая многим...

За ранее благодарю за полезные советы и ответы.

/*
Created 2016
by AlexGyver
AlexGyver Home Labs Inc.
*/

unsigned long lastflash;
int RPM;

void setup() {
	Serial.begin(9600);  //открыть порт
	attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
	pinMode(3, OUTPUT);   //3 пин как выход
	digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин
}
void sens() {
	RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
	lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
	if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
		RPM=0;  //считаем что RPM 0
	}
	Serial.println(RPM);   //вывод в порт
	delay(50);  //задержка для стабильности
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Prokl пишет:

Прога не моя, автор не откликается. Вопрос: можно ли дописать её или нужно все начинать с чистого листа? Смысл в том что бы отключать пусковые конденсаторы электродвигателя по достижению определенных оборотов. 

Например:  от 0 до 1000 оборотов реле включено, от 1000 и больше выключено. Как понимаете раз я задаю подобные вопросы, значит я далек от програмирования чего либо, так же как Валуев от квантовой физики... По этому прошу не кидаться тапками.

Ни чего подобного в сети не нашел, а тема по настоящему интересная и необходимая многим...

За ранее благодарю за полезные советы и ответы.

/*
Created 2016
by AlexGyver
AlexGyver Home Labs Inc.
*/

unsigned long lastflash;
int RPM;

void setup() {
	Serial.begin(9600);  //открыть порт
	attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
	pinMode(3, OUTPUT);   //3 пин как выход
	digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин
}
void sens() {
	RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
	lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
	if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
		RPM=0;  //считаем что RPM 0
	}
	Serial.println(RPM);   //вывод в порт
	delay(50);  //задержка для стабильности
}

 

в этом разделе помогаю тем, кто сам пишет.

в Ищу исполнителя за денежку могут сделать...

DIVGENY
Offline
Зарегистрирован: 23.08.2016

  для начала вам нужно заглянуть сюда

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

b707
Offline
Зарегистрирован: 26.05.2017

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

Далее - вздохи и ахи "Неужели придется писать с чистого листа?" для кода в 10 строк выглядят несколько смешно.

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

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

Порадовали амбиции Алекса двухгодичной давности:

Цитата:

AlexGyver Home Labs Inc.

Интересно - и давно он зарегистрировал (и, главное - где?) Incorporated? 

Prokl
Offline
Зарегистрирован: 25.11.2018

DIVGENY

Понял вас, теперь буду знать. Спасибо.

Prokl
Offline
Зарегистрирован: 25.11.2018

b707

Не знал что так можно, я только вчера зарегестрировался...))

Что касается второго пункта, я понимаю что выглядит смешно для вас и тех для кого эта тема "как два пальца об асфальт", я же написал выше что в написании программы туп как шар, собственно по этому и спрашиваю.

По третьему пункту, не вкурсе был, просто залил на свою Leonardo, поменял в  attachInterrupt с 0 на 2 и GND проводком соединил ибо распиновка немного отличается у nano и leonardo. Все заработало. Соответственно и возник вопрос о большей функциональности...

В принципе я вас понял, спасибо.

Prokl
Offline
Зарегистрирован: 25.11.2018

DIYMan

)))) Но за то как звучит....))))

Prokl
Offline
Зарегистрирован: 25.11.2018

Исправился.. Надеюсь правильно, поправьте если что то не так сделал.

unsigned long lastflash;
int RPM;

void setup() {
	Serial.begin(9600);  //открыть порт
	attachInterrupt(2,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
	pinMode(3, OUTPUT);   //3 пин как выход
	digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин
}
void sens() {
	RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
	lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
	if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
		RPM=0;  //считаем что RPM 0
	}
	Serial.println(RPM);   //вывод в порт
	delay(50);  //задержка для стабильности
}

 

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

Да я смотрю у гувера переменная в прерывании не только не волатильная, но и операциях не блочится. С таким кодом двигатель кондеры не только откажется отключать, а еще и жахнет в них 300% энергии или еще что отчебучит.

Prokl
Offline
Зарегистрирован: 25.11.2018

sadman41

Он это писал просто как тахометр - спидометр. Может по этому так?

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

Да хоть как бы что он его писал - хоть тахометр, хоть хренометр.

Значение переменной RPM прерыванием может изменено в любой момент выполнения программы. Это означает, что в if() оно будет одним, а в print() вообще другим. Еще пару действий к этому RPM привязать и вся шарманка вразнос пойдет на высокой скорости.

Prokl
Offline
Зарегистрирован: 25.11.2018

vvadim

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

Prokl
Offline
Зарегистрирован: 25.11.2018

sadman41

Значит 2:0 в пользу того что от этого скетча отталкиваться не стоит...))) 

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

Отталкиваться или нет - вопрос философский. В конце концов если я примерно то же самое напишу с нуля, но правильно - это будет "отталкиванием от кода Гувера"?

Идея там нормальная, но реализация... 

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

DIYMan пишет:

Порадовали амбиции Алекса двухгодичной давности:

Цитата:

AlexGyver Home Labs Inc.

Интересно - и давно он зарегистрировал (и, главное - где?) Incorporated? 

дык в Home же, ясно написано.

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

Prokl пишет:

Исправился.. Надеюсь правильно, поправьте если что то не так сделал.

На будущее, вставлять номера строк (есть галочка). И не писать жирным шрифтом. ИМХО.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Погуглите пусковое реле или реле времени на пусковой конденцатор.
Задачу можно и без МК решить.

Prokl
Offline
Зарегистрирован: 25.11.2018

bwn.

Ок.

Prokl
Offline
Зарегистрирован: 25.11.2018

yul-i-an

Я в курсе и про то и про другое. Пусковое реле максимально находил на 1квт, этого мало, у меня к примеру 2.2 квт. Реле времени устоит в данный момент, но работает плохо и не корректно. Отключение по оборотам это самое оптимальное решение, по току конечно лучше но как уже сказал релюшки больше чем на 1 квт не встречал. Плюс ко всему проблемы с напряжением, в зимний период бывает и 192 вместо 220 вольт, при таком напряжении советские ПМЕ вообще не пускаются, не то что релюхи...

Решение с внедрением магнита в электродвигатель и установки датчика холла, самое на мой взгляд оптимальное да и универсальное ибо по сути одна и таже схема подойдет для разнообразных двигателей, все что нужно будет изменить в программе это обороты отключения пусковых конденсаторов, для двигателей 700, 900, 1500, 3000 оборотов будет разное значение.

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

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

посмотрите пусковые реле холодильников

b707
Offline
Зарегистрирован: 26.05.2017

Prokl пишет:

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

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

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

Второй пример - обороты были 2000, стали 500. Подавть питание на реле или нет?

Prokl
Offline
Зарегистрирован: 25.11.2018

ВН

Смотрел. Они все на маломощные моторы. Надо от 2 квт и более..

Prokl
Offline
Зарегистрирован: 25.11.2018

b707

Я добавил три строчки, в итоге как только подключаешь что либо на управляющий контакт, показания сходят с ума. При чем не постоянно. То все нормально работает, то не подавая сигнада на датчик показывает обороты от 0 до 3000... По этому и спрашиваю здесь стоит ли заморачиваться с этим скетчем? Большинство как я понял считают что не стоит. 

b707
Offline
Зарегистрирован: 26.05.2017

Prokl пишет:

 По этому и спрашиваю здесь стоит ли заморачиваться с этим скетчем? Большинство как я понял считают что не стоит. 

вам же сказали, что сама идея верная. Минимальная правка может сделать из этого шита нормальный код. Я, правда, не специалист по прерываниям, пусть коллеги поправят, если что.

Вот мой вариант правки исходного кода

volatile unsigned long lastflash;
volatile unsigned long  period;
int RPM;

void setup() {
	Serial.begin(9600);  //открыть порт
	attachInterrupt(2,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
	pinMode(3, OUTPUT);   //3 пин как выход
	digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин
}
void sens() {
	
        period = micros()-lastflash;
	lastflash=micros();  //запомнить время последнего оборота
}

void loop() {

if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
		RPM=0;  //считаем что RPM 0
	}
else RPM=60/((float)(period)/1000000);  //расчет	
Serial.println(RPM);   //вывод в порт
delay(50);  //задержка для стабильности
}

 

Prokl
Offline
Зарегистрирован: 25.11.2018

b707

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