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);
}

, 👍0


1 ответ


1

OVF означает переполнение, вы, вероятно, превысили диапазон используемого типа данных. Попробуйте /1000; /10000000000 и т. д. в вашу переменную, пока вы не получите OVF или не используете тип данных с большим диапазоном.

,