OVF в последовательном мониторе вместо данных
В настоящее время я работаю с двумя Arduino и пытаюсь их синхронизировать. Я хочу получить данные с четырех акселерометров LIS3DH. Акселерометры LIS3DH подключаются к Arduino по интерфейсу I2C. Мне удалось синхронизировать Arduino с помощью SPI, но когда я получаю третий набор данных, он продолжает показывать OVF, а не значения. Мой код ниже, может кто-нибудь помочь мне?
Спасибо
// Мастер SPI
#include <Wire.h>
#include <SPI.h>
#include "SPI_anything.h"
#include <Adafruit_LIS3DH.h>
#include <Adafruit_Sensor.h>
//#определить LIS3DH_CLK 13
//# определить LIS3DH_MISO 12
//#определить LIS3DH_MOSI 11
//#определить LIS3DH_CS 10
// I2C
Adafruit_LIS3DH lisch1 = Adafruit_LIS3DH();
Adafruit_LIS3DH lisch2 = Adafruit_LIS3DH();
// Adafruit_LIS3DH lisch3 = Adafruit_LIS3DH();
struct event3;
#if defined(ARDUINO_ARCH_SAMD)
// для Zero, вывод на консоль USB Serial, удалить строку ниже, если используется
// программный порт для программирования Zero!
#define Serial SerialUSB
#endif
void setup() {
#ifndef ESP8266
while (!Serial)
; // приостановит работу Zero, Leonardo и т. д., пока не откроется последовательная консоль
#endif
Serial.begin(9600);
// нужно отправить на вход master, *slave на выход*
pinMode(MISO, OUTPUT);
// включаем SPI в ведомом режиме
SPCR |= _BV(SPE);
Serial.println("LIS3DH test!");
if (!lisch1.begin(0x19)) { // изменить это на 0x19 для альтернативного адреса i2c
// - Напряжение SDO
Serial.println("Couldnt start");
while (1)
;
}
Serial.println("LIS3DH1 found!");
if (!lisch2.begin(0x18)) { // изменить это на 0x18 для альтернативного адреса i2c
// - Заземление SDO
Serial.println("Couldnt start");
while (1)
;
}
Serial.println("LIS3DH2 found!");
lisch1.setRange(LIS3DH_RANGE_16_G); // 2, 4, 8 или 16 G!
lisch2.setRange(LIS3DH_RANGE_16_G); // 2, 4, 8 или 16 G!
Serial.print("Range = ");
Serial.print(2 << lisch1.getRange());
Serial.print("Range = ");
Serial.print(2 << lisch2.getRange());
Serial.println("G");
}
void loop() {
lisch1.read(); // получить данные XY и Z одновременно
/* Or....get a new sensor event, normalized */
sensors_event_t event;
lisch1.getEvent(&event);
/* Display the results (acceleration is measured in m/s^2) */
Serial.print(" \t ");
Serial.print(event.acceleration.x);
Serial.print(" \t ");
Serial.print(event.acceleration.y);
Serial.print(" \t ");
Serial.print(event.acceleration.z);
lisch2.read(); // получить данные XY и Z одновременно
lisch2.getEvent(&event);
/* Display the results (acceleration is measured in m/s^2) */
Serial.print(" \t ");
Serial.print(event.acceleration.x);
Serial.print(" \t ");
Serial.print(event.acceleration.y);
Serial.print(" \t ");
Serial.print(event.acceleration.z);
struct event;
SPI_readAnything(event);
// Sensors_event_t событие;
// lisch3.getEvent(&event);
Serial.print(" \t "); Serial.print(float2s(event.acceleration.x,6);
Serial.print(" \t "); Serial.print(event.acceleration.y);
Serial.print(" \t "); Serial.print(event.acceleration.z);
Serial.println ();
delay(500);
}
/ SPI Slave
#include <Wire.h>
#include <SPI.h>
#include "SPI_anything.h"
#include <Adafruit_LIS3DH.h>
#include <Adafruit_Sensor.h>
#define LIS3DH_CLK 13
#define LIS3DH_MISO 12
#define LIS3DH_MOSI 11
#define LIS3DH_CS 10
// I2C
Adafruit_LIS3DH lisch3 = Adafruit_LIS3DH();
#if defined(ARDUINO_ARCH_SAMD)
// для Zero, вывод на консоль USB Serial, удалить строку ниже, если используется
// программный порт для программирования Zero!
#define Serial SerialUSB
#endif
void setup() {
#ifndef ESP8266
while (!Serial)
; // приостановит работу Zero, Leonardo и т. д., пока не откроется последовательная консоль
#endif
Serial.begin(9600); // запускаем сериал для вывода
SPI.begin();
// Немного замедлить мастер
SPI.setClockDivider(SPI_CLOCK_DIV8);
Serial.println("LIS3DH3 test!");
if (!lisch3.begin(0x19)) { // изменить это на 0x19 для альтернативного адреса i2c
// - Напряжение SDO
Serial.println("Couldnt start");
while (1)
;
}
Serial.println("LIS3DH3 found!");
lisch3.setRange(LIS3DH_RANGE_16_G); // 2, 4, 8 или 16 G!
Serial.print("Range = ");
Serial.print(2 << lisch3.getRange());
Serial.println("G");
}
void loop() {
lisch3.read(); // получить данные XY и Z одновременно
/* Or....get a new sensor event, normalized */
sensors_event_t event;
lisch3.getEvent(&event);
/* Display the results (acceleration is measured in m/s^2) */
Serial.print(" \t ");
Serial.print(event.acceleration.x);
Serial.print(" \t ");
Serial.print(event.acceleration.y);
Serial.print(" \t ");
Serial.print(event.acceleration.z);
Serial.println();
digitalWrite(SS, LOW); // SS — это контакт 10
SPI_writeAnything(event);
digitalWrite(SS, HIGH);
// задержка (1000); // для тестирования
delay(100);
}
@mariumb, 👍0
1 ответ
▲ 1
OVF означает переполнение, вы, вероятно, превысили диапазон используемого типа данных. Попробуйте /1000; /10000000000 и т. д. в вашу переменную, пока вы не получите OVF или не используете тип данных с большим диапазоном.
,
@Hamish_Fernsby
Смотрите также:
- Попытка использовать акселерометр I2C и SPI OLED
- Последовательная связь между несколькими устройствами (или ардуино)
- Использование MPU-6050 без I2C
- Arduino UNO несовместимо с чтением регистра I2C из ArduCam
- ADXL345 выдает ошибку проводки в режиме SPI
- MPU-6050 с Arduino – вскрытие
- Как использовать SPI на Arduino?
- Отправка и получение различных типов данных через I2C в Arduino