Чтение значений с помощью HC-05 и отправка команд одновременно работают непоследовательно.
Совершенно не силен в программировании, так что я в полной растерянности.
Но я делаю проект, который предполагает управление большим постоянным напряжением через МОП-транзистор. Я использую HC-05 для передачи данных между телефоном и Arduino Uno. Необходимо увидеть значение в течение нескольких секунд.
Однако отправка затвору мосфета команды на открытие или закрытие работает очень непоследовательно. Иногда никогда, а иногда регистрация занимает до 30 секунд.
Приведенный здесь код представляет собой короткую версию проекта, над которым я работаю, но ведет себя аналогично.
#define mosfet 11
int state = 0;
int gate = 0;
int maxgate = 255;
int mingate = 0;
void setup() {
delay(2000);
pinMode(mosfet, gate);
analogWrite(mosfet, 0); //начинается с закрытия
Serial.begin(9600);
}
void loop() {
while(Serial.available() > 0){
state = Serial.read();
for (int y=0; y <= 5; y+=5){
delay(500);
Serial.println("testphase 1");
delay(500);
}
for (int y=5; y >= 0; y--){
delay(250);
Serial.println("testphase 2");
delay(250);
}
if (state == '0') {
gate = gate + 1;
if(gate > maxgate) gate = maxgate;
analogWrite(mosfet, gate);
Serial.println(int(gate));Serial.print(", +1");
state = 0;
}
if (state == '1') {
gate = gate + 10;
if(gate > maxgate) gate = maxgate;
analogWrite(mosfet, gate);
Serial.println(int(gate));Serial.print(", +10");
state = 0;
}
}
}
Например, при отправке «State == 1» он будет проходить как циклы for несколько раз, так и, возможно, иногда dogate + 10. Иногда команды полностью игнорируются.
Я понятия не имею, как прервать цикл, чтобы выполнить данную команду, а затем вернуться обратно.
1 ответ
На самом деле у меня все получилось, но большое спасибо за помощь @chrisl
Полностью отказался от цикла for, просто чтобы попробовать, и немного реорганизовал свой код. На удивление, это начало работать достаточно хорошо.
По сути, я просто переместил свои измерения за пределы цикла while* (и теперь, когда я думаю об этом, зачем это вообще должно быть внутри цикла while? Буквально не имеет смысла)* и в конец всей части цикла void, и опрашивается только об изменениях состояния в цикле while, пока соединение BT активно.
Насколько я могу судить, не пропускает ни одной команды, а корректировка происходит в течение 2 секунд при использовании всего моего кода, что идеально. Кроме того, вся программа не просто зависает, пытаясь понять, что произошло при отправке набора изменений.
Вот краткая версия, на случай, если кто-нибудь зайдет на эту тему в будущем.
void loop() {
while(Serial.available() > 0){
state = Serial.read();
if (state == '0') {stuff happens here,
}
} // Конец цикла while.
sensors.requestTemperatures();
delay(1000);
Celcius=sensors.getTempCByIndex(0);
}
- L298N, HC-05 Простой автомобиль с дистанционным управлением через Bluetooth, не работающий в Arduino
- Мой модуль Bluetooth HC-05 не работает
- Подключить один «главный» HC-05 к двум подчиненным одновременно.
- Модуль Bluetooth против беспроводного модуля Arduino
- Модуль HC-05 не получает команд и не спаривается
- Потребляемая Мощность Arduino
- Проблема чтения данных Arduino Bluetooth HC-05
- Буферизует ли модуль HC-05 полученные данные?
Зачем вам эти циклы for? Если вы хотите сделать что-то синхронизированное, но при этом реагировать на команды, вы можете сделать свой код неблокирующим, как в примере BlinkWithoutDelay в Arduino IDE., @chrisl
pinMode()
кажется неправильным (из-за того, что переменнаяgate
помещает туда, где должна быть константа pinmode). Но это не должно быть проблемой, поскольку AnalogWrite() правильно настраивает вывод., @chrislОткуда ты знаешь, что это занимает так много времени? Вы измеряете сигнал ШИМ, который поступает на МОП-транзистор? Вам нужно будет отправить много раз «0» или «1», чтобы получить максимальное значение., @chrisl
Циклы IF с изменением состояния — лишь некоторые из многих, которые есть в моем коде, но я вырезал большую их часть, чтобы просто протестировать код. Даже добавление +1 или +10 к переменной затвора должно показать некоторые признаки жизни светодиода, который я использую для тестирования системы, прежде чем я подключу его к более мощному источнику постоянного тока., @ProbablyGonnaBurnMyHouse
Также добавлю к своему предыдущему комментарию. Откуда я знаю, что это занимает так много времени? Он должен печатать текущее значение + добавленную сумму при обнаружении изменения, и это изменение должно быть легко заметно с помощью зеленого светодиода, который я использую для тестирования. Хотя теперь я вижу, что на самом деле он просто печатает текущее значение + добавленную сумму., @ProbablyGonnaBurnMyHouse
Кроме того, почему циклы for? Честно говоря, это просто мне не хватает опыта в кодировании, и я решил попробовать. У меня есть версия, в которой сейчас нет циклов for. Честно говоря, работают примерно так же... может быть, вкладка немного более отзывчива. Насколько важным будет размещение этих операторов if(state == x)?, @ProbablyGonnaBurnMyHouse