Чтение значений с помощью 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. Иногда команды полностью игнорируются.

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

, 👍0

Обсуждение

Зачем вам эти циклы for? Если вы хотите сделать что-то синхронизированное, но при этом реагировать на команды, вы можете сделать свой код неблокирующим, как в примере BlinkWithoutDelay в Arduino IDE., @chrisl

pinMode() кажется неправильным (из-за того, что переменная gate помещает туда, где должна быть константа pinmode). Но это не должно быть проблемой, поскольку AnalogWrite() правильно настраивает вывод., @chrisl

Откуда ты знаешь, что это занимает так много времени? Вы измеряете сигнал ШИМ, который поступает на МОП-транзистор? Вам нужно будет отправить много раз «0» или «1», чтобы получить максимальное значение., @chrisl

Циклы IF с изменением состояния — лишь некоторые из многих, которые есть в моем коде, но я вырезал большую их часть, чтобы просто протестировать код. Даже добавление +1 или +10 к переменной затвора должно показать некоторые признаки жизни светодиода, который я использую для тестирования системы, прежде чем я подключу его к более мощному источнику постоянного тока., @ProbablyGonnaBurnMyHouse

Также добавлю к своему предыдущему комментарию. Откуда я знаю, что это занимает так много времени? Он должен печатать текущее значение + добавленную сумму при обнаружении изменения, и это изменение должно быть легко заметно с помощью зеленого светодиода, который я использую для тестирования. Хотя теперь я вижу, что на самом деле он просто печатает текущее значение + добавленную сумму., @ProbablyGonnaBurnMyHouse

Кроме того, почему циклы for? Честно говоря, это просто мне не хватает опыта в кодировании, и я решил попробовать. У меня есть версия, в которой сейчас нет циклов for. Честно говоря, работают примерно так же... может быть, вкладка немного более отзывчива. Насколько важным будет размещение этих операторов if(state == x)?, @ProbablyGonnaBurnMyHouse


1 ответ


2

На самом деле у меня все получилось, но большое спасибо за помощь @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);
}
,