Arduino перезагружается после последовательного ввода от Raspberry Pi

У меня есть этот код, работающий на ардуино:

#include <SoftwareSerial.h>

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// pins!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
const int delayTime=10;

const int pin_yes_gate=3;
const int pin_no_gate=5;

int switchVal =0;

void setup()
{
  Serial.begin(9600); // Initialize serial port to send and receive at 9600 baud
  pinMode(pin_yes_gate, OUTPUT);
  pinMode(pin_no_gate, OUTPUT);

}

void loop()
{
    if (switchVal ==1 ){
      allow();
    }else{
      prohibit();
    }

  if ( Serial.available())
  {
    String string = Serial.readString();
    string.trim();
    Serial.print("I received: ");
    Serial.print(string);
    Serial.print("\n");

    if (string.equals("allowed"))
    {
      switchVal=1;
    }else if (string.equals("error"))
    {
      switchVal=0;
    }
  }
}

void allow(){
  digitalWrite(pin_yes_gate,HIGH);
  digitalWrite(pin_no_gate,LOW);
  delay(delayTime);
}

void prohibit(){
  digitalWrite(pin_yes_gate,LOW);
  digitalWrite(pin_no_gate,HIGH);
  delay(delayTime);
}

а я пишу echo allowed >> /dev/ttyACM0 что дает реакцию, но меньше секунды, а потом ардуино возвращается в исходное состояние. Это странно, так как он отлично работает с Arduino IDE.

Я что-то пропустил ?

Единственное, о чем я задаюсь вопросом, какой эффект должен иметь delay(delayTime); и могут ли быть проблемы, если вы неоднократно делаете эти digitalWrites. Что, если вы удалите часть if (switchVal ==1 ){ ... } else { ... } и вызовете allow и prohibit непосредственно при получении строк? if (string.equals("allowed")) allowed(); else if (string.equals("error")) prohibit(); В этом случае вы также можете удалить обе delays.

Ted Lyngmo 18.12.2020 16:48

Задержка @TedLyngmo необходима, так как система, принимающая сигналы, запросила задержку. Я решил это ниже .... так тривиально, но у меня ушло много лет

PepeRaikkonen 18.12.2020 16:54

«система, принимающая сигналы, запросила задержку» — система, принимающая сигналы, не заметит, если задержка устранена, если вы сделаете то, что я предложил до этого. Он будет переключать контакты так быстро, как вы можете набрать error со скоростью 9600 бит/с.

Ted Lyngmo 18.12.2020 16:57
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Только что решил, видимо проблема в нем

    Serial.print("I received: ");
    Serial.print(string);
    Serial.print("\n");

Выдается ошибка, если серийный номер не читается. Поэтому либо удалите это, либо, как в моем случае, я не могу ничего изменить на стороне arduino, запустите эту команду при загрузке raspi tail -f /dev/ttyACM0 &, которая откроет порт для чтения

Другие вопросы по теме