Форум РадиоКот https://radiokot.ru/forum/ |
|
помогите пожалуйста с кодом https://radiokot.ru/forum/viewtopic.php?f=66&t=197109 |
Страница 1 из 1 |
Автор: | Tobi48 [ Пн мар 10, 2025 12:28:23 ] |
Заголовок сообщения: | помогите пожалуйста с кодом |
здравствуйте скажем программист из меня не очень сделал устройство на базе ардуино уно в принципе все работает как надо только зуммер не всегда пищит при срабатывании схемы как то даже не через раз а очень редко.индикация светодиодом нормально работает ,серво тоже а вот пищалка не пищит редко редко когда пискнет. #include <Servo.h> Servo myservo; int buzzerPin = 3; // пин пищалки на микросхеме 5 int servoPin = 9; // пин серво привода на микросхеме 15 #define analogPin 5 // пин датчика на микросхеме 28 int ledPin = 13; // пин светодиода на микросхеме 19 //////////////////////////////////////////////// float wait = 90000; // Время ожидания (В милисекундах) до игры первым вариантом float wait_after_move = 9000; // Время ожидания опроса датчика после движения серво привода (В милисекундах) int analog_max_val = 1024; // Зависит от качество потанцеометра (можно оставить 1024 но может быть не точные значения) float alarm_sub = 0.05; // Разность на которое будет работать пишалка float servo_sub = 0.2; // Разность на которое будет работать серво привод int alarm_led_on = 50; // Время гореня светодиода во время и после пищалки int alarm_led_off = 100; // Время НЕ гореня светодиода во время и после пищалки int alarm_led_time = 3000; // Сколько времени гореть светодиоду после пищалки int servo_disable_time = 5000; // Сколько времени ждать сервоприводу после последнего движения чтобы выключится int cutting_angle = 40; // угол серво int cutting_delay = 1000; // сколько времени будет находится в сработке int angles[] = { 0, 9, 15, 19, 25, 40 }; // диаппазоны игры т.е углы которые указыны в диапозонах вольтажа float times[] = { 500, 1500, 500, 500, 500 }; // задержки для углов //////////////////////////////////////////////// //---------- uint32_t tmr, servo_tmr, servo_tmr2, servo_tmr3, servo_tmr4, value_tmr, led_after_alarm_tmr, disable_servo_tmr; // таймеры int index; // Текущий шаг сервопривода float value; // Текущее значения float old_v[100]; // Предыдушие значения bool servo_ended, servo_moving, servo_moving2, servo_after_move, alarm_led, servo_enabled; //---------- void setup() { Serial.begin(6900); move_servo(0); // Увести серво привод в 0 при запуске pinMode(buzzerPin, OUTPUT); // Настроить пин пищалки pinMode(ledPin, OUTPUT); // Настроить пин светодиода pinMode(analogPin, INPUT); // Настроить пин датчика } void loop() { value = constrain(float(analogRead(analogPin)) / analog_max_val, 0, 1) * 5; // Считывание значения Serial.print(old_v[0]); //-- Serial.print(" "); //хз почему но без этого не работает Serial.println(value); //-- if ((millis() - servo_tmr >= wait_after_move) and (alarm_sub <= abs(value - old_v[0]))) { // если вольтаж в диапозоне пищалки alarm_tick(); // тик пищалки alarm_led = 1; // включить светодиод на 3 секунды led_after_alarm_tmr = millis(); // сбросить таймер светодиода } else { // иначе digitalWrite(buzzerPin, 0); // не пищать } if (millis() - led_after_alarm_tmr >= alarm_led_time) { // если свтодиод горит уже достаточное время alarm_led = 0; // выключить светодиод } //---------- Серво привод if (millis() - servo_tmr >= wait_after_move and (!servo_after_move)) { // Если можно проверять вольтаж (тоесть не слишком рано после игры или подсечки) servo_moving = 0; if (servo_sub <= abs(value - old_v[0])) { // Если вольтаж в диапозоне сробатывания серво servo_ended = 0; //-- index = 0; //сбросить переменные servo_after_move = 1; //-- servo_tmr = millis(); //-сбросить таймеры servo_tmr4 = millis(); //-- move_servo(cutting_angle); // установить серво на угол подсечки } } if (millis() - servo_tmr >= wait and (!servo_moving) and (!servo_after_move)) { // Есои время ожидания истекло и серво не двигается servo_moving = 1; //-- index = 0; //сбросить переменные servo_ended = 0; //-- servo_tmr2 = millis(); //-сбросить таймеры servo_tmr = millis(); //-- } if (servo_moving and (!servo_moving2) and (!servo_after_move)) { // Игра серво приводом servo_tick(); // Тик сервопривода } if ((index == sizeof(angles) / 2) and (!servo_after_move)) { // Конец игры серво приводом servo_tmr4 = millis(); //-- servo_moving2 = 0; //сбросить переменные и таймер servo_after_move = 1; //-- } if ((millis() - servo_tmr4 >= 1000) and servo_after_move) { // После игры или подсечки серво приводом и 1000 милисекунды servo_tmr = millis(); //-- servo_tmr2 = millis(); //сбросить таймеры servo_tmr3 = millis(); // servo_tmr4 = millis(); //-- servo_after_move = 0; //-сбросить переменные index = 0; //-- move_servo(0); // установить серво в 0 } //---------- Серво привод uint16_t period; //---------- Моргание светодиода static uint32_t led_tmr; if (digitalRead(ledPin)) { period = 50; //время горения светодиода if (alarm_led) period = alarm_led_on; // Установить время горения светодиода после пищалки } else { period = 3000; //время между миганиями светодиода if (alarm_led) period = alarm_led_off; // Установить время НЕ горения светодиода после пищалки } if (millis() - led_tmr >= period) { led_tmr = millis(); digitalWrite(ledPin, !digitalRead(ledPin)); } //---------- Моргание светодиода if (millis() - value_tmr >= 10) { value_tmr = millis(); int update_index = floor(millis() - value_tmr / 10); for (int i = 0; i <= 100; i++) { if (i == 0) { continue; } old_v[i - 1] = old_v[i]; } old_v[100] = value; } if (millis() - disable_servo_tmr >= servo_disable_time and servo_enabled) { // если нужно выключить серво привод и он не выключен servo_enabled = 0; myservo.detach(); // выключить серво привод } } void alarm_tick() { static uint32_t buz_tmr; //---------- Пищалка int buz_t_sub = millis() - buz_tmr; // таймер if (buz_t_sub >= 220) { // сколко времени пищать в милисекундах buz_tmr = millis(); } else { if ((constrain(buz_t_sub, 0, 50) == buz_t_sub) or (constrain(buz_t_sub, 151, 170) == buz_t_sub)) { // тайминги писка digitalWrite(buzzerPin, 1); } if ((constrain(buz_t_sub, 51, 150) == buz_t_sub) or (constrain(buz_t_sub, 171, 220) == buz_t_sub)) { // тайминги НЕ писка digitalWrite(buzzerPin, 0); } } //---------- Пищалка } void servo_tick() { uint32_t servo_period; //---------- игра серво приводом if (servo_ended) { return; } // если играть больше не нужно if (millis() - servo_tmr2 >= times[index]) { // если нужно перейти на следующий шаг servo_tmr2 = millis(); // сбросить таймер if (index == sizeof(angles) / 2 - 1) { // если это конец игры move_servo(angles[index]); // установить серво на нужный угол servo_ended = 1; // установить переменную конца игры на 1 } index++; // прибавить шаг } else { move_servo(angles[index]); // установить серво на нужный угол } //---------- игра серво приводом } void move_servo(int angle) { servo_enabled = 1; myservo.attach(servoPin, 600, 2400); // Диапозон серво привода myservo.write(angle); // Увести серво привод на нужный угол disable_servo_tmr = millis(); } |
Автор: | smacorp [ Пн мар 10, 2025 13:15:55 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
digitalWrite(buzzerPin, 1) Так будет пищать только активный бузер. Вы уверены, что у Вас именно такой? |
Автор: | Tobi48 [ Пн мар 10, 2025 13:21:58 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
да такой специально брал чтоб с программой не заморачиваться.он пищит иногда при сработке но не всегда причем светодиод всегда сигнализирует о сработке быстрым миганием в течении трех секунд |
Автор: | ELECTROS [ Пн мар 10, 2025 14:59:09 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
здравствуйте скажем программист из меня не очень сделал устройство на базе ардуино уно в принципе все работает как надо только зуммер не всегда пищит при срабатывании схемы как то даже не через раз а очень редко.индикация светодиодом нормально работает ,серво тоже а вот пищалка не пищит редко редко когда пискнет. #include <Servo.h> Servo myservo; .................. } Непрограммист, оформить то код читабельно можно ведь, это несложно? Просите помощи, а вываливаете кучу текста, у меня вопрос сразу возник , а почему не в одну строчку вообще? здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть. Код: abs(value - old_v[0]) Сильно неправильно структура алгоритма, неявные таймеры. Поставьте там где вызывается alarm_tick(), отправку отладочной инфы со значениями millis хотябы и смотрите как часто туда запрыгивает. alarm_tick поправить так , чтобы не подбирать числа на "тишину" Код: void alarm_tick() {
static uint32_t buz_tmr; //---------- Пищалка int buz_t_sub = millis() - buz_tmr; // таймер if (buz_t_sub >= 220) // сколко времени пищать в милисекундах buz_tmr = millis(); else { if ((constrain(buz_t_sub, 0, 50) == buz_t_sub) or (constrain(buz_t_sub, 151, 170) == buz_t_sub)) // тайминги писка digitalWrite(buzzerPin, 1); else // тайминги НЕ писка digitalWrite(buzzerPin, 0); } //---------- Пищалка } |
Автор: | Adrift [ Пн мар 10, 2025 15:32:16 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть. Это ардуино, значит C++ и abs() перегружается в том числе и для float. |
Автор: | Tobi48 [ Пн мар 10, 2025 15:41:30 ] | ||
Заголовок сообщения: | Re: помогите пожалуйста с кодом | ||
сразу отругали.может так читабельнее будет
|
Автор: | ELECTROS [ Вт мар 11, 2025 10:37:49 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть. Это ардуино, значит C++ и abs() перегружается в том числе и для float. Точно, дурдуина же. |
Автор: | OKF [ Вт мар 11, 2025 13:03:59 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
Может так?: Код: #define abs(x) ((x)>0?(x):-(x)) И кто тут дурдуина?) |
Автор: | Tobi48 [ Вт мар 11, 2025 14:07:35 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
ох на чужом для меня языке разговариваете Добавлено after 3 minutes 28 seconds: так то мечта у меня перевести этот проект на аттини 85 но уверен что мозгей не хватит Добавлено after 6 minutes 2 seconds: ох на чужом для меня языке разговариваете Добавлено after 3 minutes 28 seconds: так то мечта у меня перевести этот проект на аттини 85 но уверен что мозгей не хватит если она потянет конечно |
Автор: | Ariadna-on-Line [ Пт мар 14, 2025 18:51:26 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
да такой специально брал чтоб с программой не заморачиваться.он пищит иногда при сработке но не всегда причем светодиод всегда сигнализирует о сработке быстрым миганием в течении трех секунд Если у вас зуммер - на него просто подается питание, которое можете посмотреть подключив в параллель с ним светодиод с резистом. Если СД светится а зуммер одновременно не пищит - значит проблэм в зуммере, только и всего. Это не редкость. Вы его хоть полярностью правильно включили ? Он бывает и при переполюсовке попискивает, но очень нестабильно.
|
Автор: | Tobi48 [ Пн мар 17, 2025 11:47:24 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
Здравствуйте. Да нет в подключении я уверен как и в работоспособности, это что то програмное |
Автор: | Ariadna-on-Line [ Сб мар 22, 2025 13:08:16 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
Лучше уверенности - доверенность. Если бы вы провели опыт со светодиодом - у вас была бы не увереннность, а очевидность. Пока не проведете опыт - не о чем говорить. Загрузите стандартный blink.ino. Подключите зуммер параллельно светодиоду - и проблинкайте его до тошноты. |
Автор: | linkov1959 [ Сб мар 22, 2025 15:01:59 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
ИИ развелось, как блох! Ставишь задачу - получаешь код. Отсылаешь свой код - получаешь список ошибок и исправленный код. Я предпочитаю DeepSeek или Qwen. |
Автор: | Boryan_R [ Сб мар 22, 2025 21:42:14 ] |
Заголовок сообщения: | Re: помогите пожалуйста с кодом |
пищалки активные бывают на 5в и 3в...если схему питаете 3в, а пищалка 5 в, то будет как у вас... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |