У меня есть этот код, работающий на ардуино:
#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.
Я что-то пропустил ?
Задержка @TedLyngmo необходима, так как система, принимающая сигналы, запросила задержку. Я решил это ниже .... так тривиально, но у меня ушло много лет
«система, принимающая сигналы, запросила задержку» — система, принимающая сигналы, не заметит, если задержка устранена, если вы сделаете то, что я предложил до этого. Он будет переключать контакты так быстро, как вы можете набрать error
со скоростью 9600 бит/с.
Только что решил, видимо проблема в нем
Serial.print("I received: ");
Serial.print(string);
Serial.print("\n");
Выдается ошибка, если серийный номер не читается. Поэтому либо удалите это, либо, как в моем случае, я не могу ничего изменить на стороне arduino, запустите эту команду при загрузке raspi tail -f /dev/ttyACM0 &
, которая откроет порт для чтения
Единственное, о чем я задаюсь вопросом, какой эффект должен иметь
delay(delayTime);
и могут ли быть проблемы, если вы неоднократно делаете этиdigitalWrite
s. Что, если вы удалите частьif (switchVal ==1 ){ ... } else { ... }
и вызоветеallow
иprohibit
непосредственно при получении строк?if (string.equals("allowed")) allowed(); else if (string.equals("error")) prohibit();
В этом случае вы также можете удалить обеdelay
s.