помогите пожалуйста с кодом
помогите пожалуйста с кодом
здравствуйте скажем программист из меня не очень сделал устройство на базе ардуино уно в принципе все работает как надо только зуммер не всегда пищит при срабатывании схемы как то даже не через раз а очень редко.индикация светодиодом нормально работает ,серво тоже а вот пищалка не пищит редко редко когда пискнет.
#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 = old_v;
}
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();
}
#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 = old_v;
}
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();
}
- Реклама
Re: помогите пожалуйста с кодом
digitalWrite(buzzerPin, 1)
Так будет пищать только активный бузер. Вы уверены, что у Вас именно такой?
Так будет пищать только активный бузер. Вы уверены, что у Вас именно такой?
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Re: помогите пожалуйста с кодом
да такой специально брал чтоб с программой не заморачиваться.он пищит иногда при сработке но не всегда причем светодиод всегда сигнализирует о сработке быстрым миганием в течении трех секунд
Re: помогите пожалуйста с кодом
[uquote="Tobi48",url="/forum/viewtopic.php?p=4691933#p4691933"]здравствуйте скажем программист из меня не очень сделал устройство на базе ардуино уно в принципе все работает как надо только зуммер не всегда пищит при срабатывании схемы как то даже не через раз а очень редко.индикация светодиодом нормально работает ,серво тоже а вот пищалка не пищит редко редко когда пискнет.
#include <Servo.h>
Servo myservo;
..................
}[/uquote]
Непрограммист, оформить то код читабельно можно ведь, это несложно? Просите помощи, а вываливаете кучу текста, у меня вопрос сразу возник , а почему не в одну строчку вообще?
здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть.
Сильно неправильно структура алгоритма, неявные таймеры. Поставьте там где вызывается alarm_tick(), отправку отладочной инфы со значениями millis хотябы и смотрите как часто туда запрыгивает.
alarm_tick поправить так , чтобы не подбирать числа на "тишину"
#include <Servo.h>
Servo myservo;
..................
}[/uquote]
Непрограммист, оформить то код читабельно можно ведь, это несложно? Просите помощи, а вываливаете кучу текста, у меня вопрос сразу возник , а почему не в одну строчку вообще?
здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть.
Код: Выделить всё
abs(value - old_v[0])
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);
} //---------- Пищалка
}Re: помогите пожалуйста с кодом
[uquote="ELECTROS",url="/forum/viewtopic.php?p=4691989#p4691989"]здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть.[/uquote]
Это ардуино, значит C++ и abs() перегружается в том числе и для float.
Это ардуино, значит C++ и abs() перегружается в том числе и для float.
- Реклама
Re: помогите пожалуйста с кодом
сразу отругали.может так читабельнее будет
- Вложения
-
- программа.txt
- (12.66 КБ) 456 скачиваний
Re: помогите пожалуйста с кодом
[uquote="Adrift",url="/forum/viewtopic.php?p=4691999#p4691999"][uquote="ELECTROS",url="/forum/viewtopic.php?p=4691989#p4691989"]здесь у вас float , а abs работает с целочислеными, дальше трудно смотреть.[/uquote]
Это ардуино, значит C++ и abs() перегружается в том числе и для float.[/uquote]
Точно, дурдуина же.
Это ардуино, значит C++ и abs() перегружается в том числе и для float.[/uquote]
Точно, дурдуина же.
Re: помогите пожалуйста с кодом
Может так?:
И кто тут дурдуина?)
Код: Выделить всё
#define abs(x) ((x)>0?(x):-(x))
Re: помогите пожалуйста с кодом
ох на чужом для меня языке разговариваете
Добавлено after 3 minutes 28 seconds:
так то мечта у меня перевести этот проект на аттини 85 но уверен что мозгей не хватит
Добавлено after 6 minutes 2 seconds:
[uquote="Tobi48",url="/forum/viewtopic.php?p=4692425#p4692425"]ох на чужом для меня языке разговариваете
Добавлено after 3 minutes 28 seconds:
так то мечта у меня перевести этот проект на аттини 85 но уверен что мозгей не хватит[/uquote]
если она потянет конечно
Добавлено after 3 minutes 28 seconds:
так то мечта у меня перевести этот проект на аттини 85 но уверен что мозгей не хватит
Добавлено after 6 minutes 2 seconds:
[uquote="Tobi48",url="/forum/viewtopic.php?p=4692425#p4692425"]ох на чужом для меня языке разговариваете
Добавлено after 3 minutes 28 seconds:
так то мечта у меня перевести этот проект на аттини 85 но уверен что мозгей не хватит[/uquote]
если она потянет конечно
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1482
- Зарегистрирован: Вс май 13, 2012 00:01:54
Re: помогите пожалуйста с кодом
[uquote="Tobi48",url="/forum/viewtopic.php?p=4691948#p4691948"]да такой специально брал чтоб с программой не заморачиваться.он пищит иногда при сработке но не всегда причем светодиод всегда сигнализирует о сработке быстрым миганием в течении трех секунд[/uquote]Если у вас зуммер - на него просто подается питание, которое можете посмотреть подключив в параллель с ним светодиод с резистом. Если СД светится а зуммер одновременно не пищит - значит проблэм в зуммере, только и всего. Это не редкость. Вы его хоть полярностью правильно включили ? Он бывает и при переполюсовке попискивает, но очень нестабильно.
Re: помогите пожалуйста с кодом
Здравствуйте. Да нет в подключении я уверен как и в работоспособности, это что то програмное
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1482
- Зарегистрирован: Вс май 13, 2012 00:01:54
Re: помогите пожалуйста с кодом
Лучше уверенности - доверенность. Если бы вы провели опыт со светодиодом - у вас была бы не увереннность, а очевидность. Пока не проведете опыт - не о чем говорить.
Загрузите стандартный blink.ino. Подключите зуммер параллельно светодиоду - и проблинкайте его до тошноты.
Загрузите стандартный blink.ino. Подключите зуммер параллельно светодиоду - и проблинкайте его до тошноты.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: помогите пожалуйста с кодом
ИИ развелось, как блох! Ставишь задачу - получаешь код. Отсылаешь свой код - получаешь список ошибок и исправленный код. Я предпочитаю DeepSeek или Qwen.
- Boryan_R
- Прорезались зубы
- Сообщения: 216
- Зарегистрирован: Пт фев 21, 2014 22:39:54
- Откуда: живу на крыше
Re: помогите пожалуйста с кодом
пищалки активные бывают на 5в и 3в...если схему питаете 3в, а пищалка 5 в, то будет как у вас...


