Последовательная связь Arduino между 2 Uno
Я пытаюсь заставить два Arduino Uno общаться. Ведомое устройство считывает датчик температуры как аналоговое значение, затем преобразует его в градусы Цельсия, затем отправляет это значение ведущему устройству, а затем ведущее устройство печатает значение на последовательный монитор. Это код, который у меня есть на данный момент.
для раба
const int tempPin = A0;
void setup(){
Serial.begin(9600);
delay(2000);
}
void loop() {
//считываем данные датчика в переменную
float volt = analogRead(tempPin) * 0.004882814;
float degC = (volt - 0.5) * 100.0;
Serial.println(degC);
delay(2000); //Не заливать последовательный порт
}
это код мастера
float tempC;
void setup(){
Serial.begin(9600);
delay(2000);
}
void loop() {
/** check if data has been sent from the computer: */
while (Serial.available()) {
/* read the most recent byte */
tempC = Serial.read(); //теперь byteRead будет иметь последний датчик
// данные отправлены с Arduino1
Serial.println(tempC);
}
}
Моя проблема в том, что я читаю на последовательном мониторе 4 разных целочисленных значения
@user74953, 👍0
Обсуждение1 ответ
Ваш подчиненный отправляет массив символов, а ваш главный считывает значения ASCII этих символов.
Если вы отправите 25.43, Serial.println
отправит 7 символов 2
, 5
, .
, 4
, 3
, возврат каретки и новую строку.
Мастер прочитает их как 50, 53, 46, 52, 51, 13 и 10. Затем ваш код выведет:
50.00
53.00
46.00
52.00
51.00
13.00
10.00
На вашем главном сервере loop()
должен выглядеть так:
void loop() {
if (Serial.available()) {
char c = Serial.peek(); // просто смотрим на следующий символ в последовательном буфере
if (c == '\r' || c == '\n') // игнорировать символы возврата каретки и новой строки
Serial.read(); // удаляем символ из последовательного буфера, считывая его
else {
tempC = Serial.parseFloat(); // считываем и анализируем строку, представляющую значение с плавающей точкой
Serial.println(tempC);
}
}
}
Значение — плавающая точка, а не целое число. Чтение целой части было бы началом, хотя это приведет к усечению, а не округлению. Возможные решения — разбор плавающей точки, округление до целого числа на отправителе или что-то вроде умножения на 100, округления, отправки этого, а затем на получателе копирование умноженного значения в плавающее число и обратное деление., @Chris Stratton
Я исправил это, и теперь он правильно считывает значение с плавающей точкой., @gre_gor
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Что именно вы видите в последовательном мониторе? Что означает "*4 различных 2 целых значения*"?, @gre_gor
Код взят отсюда: https://arduinoprosto.ru/q/16227/sending-a-value-from-one-arduino-to-another Этот пример отправки и получения одного байта. Вы хотите отправить текст (текст, который показывает число с плавающей точкой), поэтому вам придется прочитать этот полный текст., @Jot