Почему последовательный монитор не печатает переменную?
Я подключил датчик цвета 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);
}
}
@Chris, 👍0
1 ответ
Лучший ответ:
▲ 1
Вы написали:
Serial.print("NDVI: "); Serial.write(NDVIred);
Вы неправильно используете метод Serial.write()
. Этот метод предназначен
для отправки необработанных байтов через последовательный порт. Поскольку вы печатаете
text, вы, вероятно, захотите, чтобы числовое значение NDVIred
было распечатано как
текст в виде десятичного числа.
Для печати текста используйте Serial.print()
и Serial.println()
:
Serial.print("NDVI: "); Serial.println(NDVIred);
,
@Edgar Bonet
Смотрите также:
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Я сделал это, и теперь он печатает «NDVI: 0». Есть ли проблема с переменными?, @Chris
@Chris: Нет, с переменной нет проблем. Вы просто видите его значение, которое оказывается равным нулю., @Edgar Bonet
Нет, код делает то, что должен. Однако существует проблема с областью действия переменной с именем «full». Она определяется как глобальная переменная, а затем как локальная переменная внутри
advancedRead()
. Это объясняет, почему NVDIred присвоено нулевое значение (которое является значением все еще неизмененной глобальной переменной Full). Чтобы исправить это, удалите определениеfull
изadvancedRead()
., @StarCat