JanPol
14.Январь.2023 17:08:10
1
Делаю код для управления двумя моторами одновременно. Суть в том, что когда в serial monitor вводится 1, вращаются в одну сторону, а когда 0 - в другую. Но проверка условия if (incomingByte == 1)
не производится. В чем моя ошибка? Может я не туда ввожу 1?
Код:
byte ena = 3;
byte in1 = 5;
byte in2 = 4;
byte enb = 9;
byte in3 = 6;
byte in4 = 7;
int incomingByte = 0;
void setup() {
pinMode( ena, OUTPUT );
pinMode( in1, OUTPUT );
pinMode( in2, OUTPUT );
pinMode( in3, OUTPUT );
pinMode( in4, OUTPUT );
pinMode( enb, OUTPUT );
Serial.begin(9600);
}
void loop() {
analogWrite (ena, 255);
analogWrite (enb, 255);
incomingByte = Serial.read();
if (incomingByte == 1) {
//clockwise
digitalWrite (in1, HIGH);
digitalWrite (in2, LOW);
digitalWrite (in3, HIGH);
digitalWrite (in4, LOW);}
else {
//counterclockwise
digitalWrite (in1, LOW);
digitalWrite (in2, HIGH);
digitalWrite (in3, LOW);
digitalWrite (in4, HIGH);}
}
Вы вводите цифру, число, символ или ascii-код?
А можно узнать, каким именно способом в serial monitor вводятся служебные коды?
Может для начала вставить после этого строку:
Serial.println(incomingByte);
и посмотреть что считалось ?
ua6em
14.Январь.2023 18:09:28
5
А если так?
if (incomingByte == '1') {
incomingByte как int?
Посмотрел в код - и правда.
Вот и верь после этого людям…
1 лайк
ua6em
14.Январь.2023 18:37:31
9
Верить никому нельзя, мне можно …
byte incomingByte = 0;
void setup() {
pinMode( ena, OUTPUT );
pinMode( in1, OUTPUT );
pinMode( in2, OUTPUT );
pinMode( in3, OUTPUT );
pinMode( in4, OUTPUT );
pinMode( enb, OUTPUT );
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
}
void loop() {
analogWrite (ena, 255);
analogWrite (enb, 255);
incomingByte = Serial.read();
Serial.println((char)incomingByte);
if (incomingByte == '1') {
//clockwise
digitalWrite (in1, HIGH);
digitalWrite (in2, LOW);
digitalWrite (in3, HIGH);
digitalWrite (in4, LOW);
}
else if(incomingByte == '2'){
//counterclockwise
digitalWrite (in1, LOW);
digitalWrite (in2, HIGH);
digitalWrite (in3, LOW);
digitalWrite (in4, HIGH);
} else {
/*
digitalWrite (in1, LOW);
digitalWrite (in2, LOW);
digitalWrite (in3, LOW);
digitalWrite (in4, LOW);
*/
}
delay(500);
}
Это вы зря человека интом попрекаете. Read() возвращает int16_t
Реально глаза открыли
Как теперь жить…все массивы размерность байт в моих поделках.
Да так же жить, как и раньше.
int16_t result = Serial.read();
If (0x00 > result) { return; }
byteArray[pos++] = result;
А если через available() проверка идёт - вообще ничего менять не нужно. Автоматом закастуется к unit8_t, а -1 при этом не вылезет никогда.