在 Arduino 中使用 Accessor 方法传递数据
Passing data using Accessor methods in Arduino
我对C++缺乏经验,但是我需要在我正在从事的这个项目中使用它。 我正在使用Arduino Mega来读取和记录LED阵列。 我让代码串行工作,但现在我试图通过定义自己的库和类来整理它。当我尝试使用访问器传递简单的数据(如引脚号和超时)时,它们都返回 0。或者当我尝试在串行端口上打印它们进行测试时,情况似乎就是这样。 这是我的代码
沉积物记录仪.h
#ifndef SEDIMENTLOGGER_H
#define SEDIMENTLOGGER_H
#include "/home/marrabld/Programming/Arduino/arduino-1.0/libraries/QTRSensors/QTRSensors.h"
#include <Arduino.h>
#define NUM_SENSORS 8
//==================================================
// This header should hold 3 small classes used for :
//--------------------------------------------------
// 1. sedimentSensor
// Dealing with sensorHardware
// 2. sedimentWriter
// Reading and writing data
// 3. sedimentTimer
// Reading and writing to the RTC
//--------------------------------------------------
//
//==================================================
class sedimentSensor
{
public:
QTRSensorsRC sensor1;
QTRSensorsRC sensor2;
sedimentSensor(); //default constructor
~sedimentSensor();
void calibrateSensors();
unsigned int *SensorValues1(){return sensorValues1;};
unsigned int *SensorValues2(){return sensorValues2;};
int SampleDelay(){return sampleDelay;};
int EmitterPin1();
private:
// Map pins to LED numbers
// first LED array
int led1;
int led2;
int led3;
int led4;
int led5;
int led6;
int led7;
int led8;
int emitterPin1;
//second Array
int led9;
int led10;
int led11;
int led12;
int led13;
int led14;
int led15;
int led16;
int emitterPin2;
int timeout; // waits for 2.5 seconds for sensor outputs to go low
long sampleDelay; // 1 second
int numSensors;
unsigned int sensorValues1[];
unsigned int sensorValues2[];
};
沉积物记录仪.cpp
#include "sedimentLogger.h"
#include <Arduino.h>
#include <QTRSensors.h>
//#include "/home/marrabld/Programming/Arduino/arduino-1.0/libraries/QTRSensors/QTRSensors.h"
sedimentSensor::sedimentSensor()
{
//Constructor
int led1 = 24;
int led2 = 26;
int led3 = 28;
int led4 = 30;
int led5 = 32;
int led6 = 34;
int led7 = 36;
int led8 = 38;
int emitterPin1 = 22;
//second Array
int led9 = 25;
int led10 = 27;
int led11 = 29;
int led12 = 31;
int led13 = 33;
int led14 = 35;
int led15 = 37;
int led16 = 39;
int emitterPin2 = 23;
int timeout = 2500; // waits for 2.5 seconds for sensor outputs to go low
int sampleDelay = 1000; // 1 second
QTRSensorsRC sensor1 ((unsigned char[]) {led1,led2,led3,led4,led5,led6,led7,led8},numSensors, timeout,emitterPin1);
QTRSensorsRC sensor2 ((unsigned char[]) {led9,led10,led11,led12,led13,led14,led15,led16},numSensors,timeout,emitterPin2);
unsigned int sensorValues1[NUM_SENSORS];
unsigned int sensorValues2[NUM_SENSORS];
};
sedimentSensor::~sedimentSensor()
{
};
int sedimentSensor::EmitterPin1()
{return emitterPin1;};
void sedimentSensor::calibrateSensors()
{
Serial.begin(9600);
unsigned int _delay = 500;
delay(_delay);
pinMode(13,OUTPUT);
for(int i = 0; i<400; i++)
{
sensor1.calibrate();
sensor2.calibrate();
}
digitalWrite(13,LOW);
//TODO WRITE MAX AND MIN VALS TO FILE
Serial.print("Array 1 Min :: ");
for (int i = 0; i < NUM_SENSORS; i++)
{
Serial.print (sensor1.calibratedMinimumOn[i]);
Serial.print(' ');
}
Serial.println();
Serial.print("Array 2 Min :: ");
for (int i = 0;i< NUM_SENSORS; i++)
{
Serial.print (sensor2.calibratedMinimumOn[i]);
Serial.print(' ');
}
Serial.println();
Serial.print("array 1 Max :: ");
// print the calibration maximum values measured when emitters were on
for (int i = 0; i < NUM_SENSORS; i++)
{
Serial.print(sensor1.calibratedMaximumOn[i]);
Serial.print(' ');
}
Serial.println();
Serial.print("array 2 Max :: ");
// print the calibration maximum values measured when emitters were on
for (int
i = 0; i < NUM_SENSORS; i++)
{
Serial.print(sensor2.calibratedMaximumOn[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(_delay);
};
主伊诺
#include <QTRSensors.h>
#include <Arduino.h>
//#include "/home/marrabld/Programming/Arduino/arduino-1.0/libraries/QTRSensors/QTRSensors.h"
#include "sedimentLogger.h"
#include <Wire.h>
#include "/home/marrabld/Programming/Arduino/arduino-1.0/libraries/RTClib/RTClib.h"
sedimentSensor sedLog;//= sedimentSensor();
void setup()
{
Serial.begin(9600);
sedLog.calibrateSensors();
}
void loop()
{
unsigned int position1 = sedLog.sensor1.readLine(sedLog.SensorValues1()); // guessing its passing SensorValues as 0s
unsigned int position2 = sedLog.sensor2.readLine(sedLog.SensorValues2());
unsigned char i;
for (i = 0; i < NUM_SENSORS; i++)
{
Serial.print(sedLog.SensorValues1()[i] * 10/10001);
Serial.print(' ');
}
Serial.println(position1);
for (i=0;i < NUM_SENSORS; i++)
{
Serial.print(sedLog.SensorValues2()[i]*10/1001);
Serial.print(' ');
}
Serial.print(" ");
Serial.println(position2);
delay(sedLog.SampleDelay()); // No delay
Serial.println(sedLog.SampleDelay()); // prints zero and shouldn't
Serial.println(sedLog.EmitterPin1()); // prints zero and shouldn't
}
校准传感器在 LED 短暂亮起时被调用。但即使是打印出串行端口的校准值也是垃圾。 如果我在主循环中编写所有这些代码,它会按预期工作。
任何帮助了解出了什么问题将不胜感激。 谢谢
在 sedimentSensor
构造函数中,声明与成员变量同名的新局部变量。
从中删除类型以转换为成员的分配。
还要将NUM_SENSORS
放在类定义的数组声明中。
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 如何使用curlpp通过POST方法上传文件和json数据
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 将线程中的数据存储到全局容器的最佳方法?
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 构造智能点数据类型以及普通数据类型的通用方法
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 创建异构顶点数据数组的可移植方法
- 使用 memcpy 将矢量数据复制到 wstring 的正确方法
- 在 std::vector<无符号字符中存储任意数据的方法>
- 在C++事务之间存储大量字符数据的有效方法
- 学习数据结构和算法的简单方法
- C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?
- C++ 使用派生类方法更改基类数据成员
- 类方法 - 数据结构中 For 循环的运行时错误