Почему последовательный монитор не печатает переменную?

Я подключил датчик цвета Adafruit к своему Arduino, и он выполняет вычисления. Однако, когда вычисления выполнены и отправлены на последовательный монитор, он сообщает: "NDVI: " без печати значения. Код прикреплен ниже. Спасибо!

Код:

/* TSL2591 Digital Light Sensor */
/* Dynamic Range: 600M:1 */
/* Maximum Lux: 88K */

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_TSL2591.h"

#define IR850 5
#define IR940 6
#define BLUE 9
#define GREEN 10
#define RED 11

// Пример демонстрации библиотеки TSL2591 — общественное достояние!

// подключаем SCL к часам I2C
// подключаем SDA к данным I2C
// подключаем Vin к 3,3-5 В постоянного тока
// подключаем ЗЕМЛЮ к общей земле

Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); // передаем число для идентификатора датчика (для дальнейшего использования)

/**************************************************************************/
/*
    Displays some basic information on this sensor from the unified
    sensor API sensor_t type (see Adafruit_Sensor for more information)
*/
/**************************************************************************/
void displaySensorDetails(void)
{
  sensor_t sensor;
  tsl.getSensor(&sensor);
  Serial.println(F("------------------------------------"));
  Serial.print  (F("Sensor:       ")); Serial.println(sensor.name);
  Serial.print  (F("Driver Ver:   ")); Serial.println(sensor.version);
  Serial.print  (F("Unique ID:    ")); Serial.println(sensor.sensor_id);
  Serial.print  (F("Max Value:    ")); Serial.print(sensor.max_value); Serial.println(F(" lux"));
  Serial.print  (F("Min Value:    ")); Serial.print(sensor.min_value); Serial.println(F(" lux"));
  Serial.print  (F("Resolution:   ")); Serial.print(sensor.resolution, 4); Serial.println(F(" lux"));  
  Serial.println(F("------------------------------------"));
  Serial.println(F(""));
  delay(500);
}

/**************************************************************************/
/*
    Configures the gain and integration time for the TSL2591
*/
/**************************************************************************/
void configureSensor(void)
{
  // Вы можете менять усиление на лету, чтобы адаптироваться к более яркому/тусклому освещению
  //tsl.setGain(TSL2591_GAIN_LOW); // 1x усиление (яркий свет)
  //tsl.setGain(TSL2591_GAIN_MED); // 25-кратный выигрыш
  tsl.setGain(TSL2591_GAIN_HIGH);   // 428-кратный выигрыш
  
  // Изменение времени интегрирования дает вам больше времени для восприятия света
  // более длинные временные рамки медленнее, но хороши в условиях очень низкой освещенности!
  //tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); // кратчайшее время интегрирования (яркий свет)
  // tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS);
  // tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS);
  // tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS);
  // tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS);
  tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS);  // самое долгое время интегрирования (тусклый свет)

  /* Display the gain and integration time for reference sake */  
  Serial.println(F("------------------------------------"));
  Serial.print  (F("Gain:         "));
  tsl2591Gain_t gain = tsl.getGain();
  switch(gain)
  {
    case TSL2591_GAIN_LOW:
      Serial.println(F("1x (Low)"));
      break;
    case TSL2591_GAIN_MED:
      Serial.println(F("25x (Medium)"));
      break;
    case TSL2591_GAIN_HIGH:
      Serial.println(F("428x (High)"));
      break;
    case TSL2591_GAIN_MAX:
      Serial.println(F("9876x (Max)"));
      break;
  }
  Serial.print  (F("Timing:       "));
  Serial.print((tsl.getTiming() + 1) * 100, DEC); 
  Serial.println(F(" ms"));
  Serial.println(F("------------------------------------"));
  Serial.println(F(""));
}


/**************************************************************************/
/*
    Program entry point for the Arduino sketch
*/
/**************************************************************************/
void setup(void) 
{
  pinMode(IR850, OUTPUT);
  pinMode(IR940, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  digitalWrite(IR850, LOW);
  digitalWrite(IR940, LOW);
  digitalWrite(RED, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(BLUE, LOW);
  Serial.begin(9600);

  Serial.println(F("Starting Adafruit TSL2591 Test!"));
  
  if (tsl.begin()) 
  {
    Serial.println(F("Found a TSL2591 sensor"));
  } 
  else 
  {
    Serial.println(F("No sensor found ... check your wiring?"));
    while (1);
  }
    
  /* Display some basic information on this sensor */
  displaySensorDetails();
  
  /* Configure the sensor */
  configureSensor();

  

  // Теперь мы готовы получать показания... переходим к циклу()!
}

/**************************************************************************/
/*
    Shows how to perform a basic read on visible, full spectrum or
    infrared light (returns raw 16-bit ADC values)
*/
/**************************************************************************/
void simpleRead(void)
{
  // Простой пример чтения данных. Просто прочтите инфракрасный полноспектральный диод.
  // или «видимые» (разница между двумя) каналами.
  // Это может занять 100-600 миллисекунд! Раскомментируйте то, что вы хотите прочитать
  uint16_t x = tsl.getLuminosity(TSL2591_VISIBLE);
  //uint16_t x = tsl.getLuminosity(TSL2591_FULLSPECTRUM);
  //uint16_t x = tsl.getLuminosity(TSL2591_INFRARED);

  Serial.print(F("[ ")); Serial.print(millis()); Serial.print(F(" ms ] "));
  Serial.print(F("Luminosity: "));
  Serial.println(x, DEC);
}

/**************************************************************************/
/*
    Show how to read IR and Full Spectrum at once and convert to lux
*/
/**************************************************************************/
uint16_t ir, full;
void advancedRead(void)
{
  // Более сложный пример чтения данных. Чтение 32 бит: верхние 16 бит ИК, нижние 16 бит полного спектра.
  // Таким образом, вы можете выполнять любые математические вычисления и сравнения!
  uint32_t lum = tsl.getFullLuminosity();
  uint16_t ir, full;
  ir = lum >> 16;
  full = lum & 0xFFFF;
  Serial.print(F("[ ")); Serial.print(millis()); Serial.print(F(" ms ] "));
  Serial.print(F("IR: ")); Serial.print(ir);  Serial.print(F("  "));
  Serial.print(F("Full: ")); Serial.print(full); Serial.print(F("  "));
  Serial.print(F("Visible: ")); Serial.print(full - ir); Serial.print(F("  "));
  Serial.print(F("Lux: ")); Serial.println(tsl.calculateLux(full, ir), 6);
}

/**************************************************************************/
/*
    Performs a read using the Adafruit Unified Sensor API.
*/
/**************************************************************************/
void unifiedSensorAPIRead(void)
{
  /* Get a new sensor event */ 
  sensors_event_t event;
  tsl.getEvent(&event);
 
  /* Display the results (light is measured in lux) */
  Serial.print(F("[ ")); Serial.print(event.timestamp); Serial.print(F(" ms ] "));
  if ((event.light == 0) |
      (event.light > 4294966000.0) | 
      (event.light <-4294966000.0))
  {
    /* If event.light = 0 lux the sensor is probably saturated */
    /* and no reliable data could be generated! */
    /* if event.light is +/- 4294967040 there was a float over/underflow */
    Serial.println(F("Invalid data (adjust gain or timing)"));
  }
  else
  {
    Serial.print(event.light); Serial.println(F(" lux"));
  }
}

int lightvalue;
int NDVIred;
int NDVIinfrared;
int NDVI;
boolean (hasrun) = false;

/**************************************************************************/
/*
    Arduino loop function, called once 'setup' is complete (your own code
    should go here)
*/
/**************************************************************************/
void loop(void)
{ 
  lightvalue = 255;
  //простоеЧтение();
  //продвинутоеЧтение();
  //unifiedSensorAPIRead();
  if(hasrun==false){
  analogWrite(RED, lightvalue);
  advancedRead();
  NDVIred = full;
  delay(5000);
  analogWrite(IR940,lightvalue);
  advancedRead();
  NDVIinfrared=full;
  NDVI=(NDVIinfrared-NDVIred)/(NDVIinfrared+NDVIred);
  Serial.print("NDVI: "); Serial.write(NDVIred);
  delay(1000);
  exit(0);
  }
}

, 👍0


1 ответ


Лучший ответ:

1

Вы написали:

Serial.print("NDVI: "); Serial.write(NDVIred);

Вы неправильно используете метод Serial.write(). Этот метод предназначен для отправки необработанных байтов через последовательный порт. Поскольку вы печатаете text, вы, вероятно, захотите, чтобы числовое значение NDVIred было распечатано как текст в виде десятичного числа.

Для печати текста используйте Serial.print() и Serial.println():

Serial.print("NDVI: "); Serial.println(NDVIred);
,

Я сделал это, и теперь он печатает «NDVI: 0». Есть ли проблема с переменными?, @Chris

@Chris: Нет, с переменной нет проблем. Вы просто видите его значение, которое оказывается равным нулю., @Edgar Bonet

Нет, код делает то, что должен. Однако существует проблема с областью действия переменной с именем «full». Она определяется как глобальная переменная, а затем как локальная переменная внутри advancedRead(). Это объясняет, почему NVDIred присвоено нулевое значение (которое является значением все еще неизмененной глобальной переменной Full). Чтобы исправить это, удалите определение full из advancedRead()., @StarCat