如何在arduino中制作另一个类库的实例变量
Posted
技术标签:
【中文标题】如何在arduino中制作另一个类库的实例变量【英文标题】:how to make instance variables of another class library in arduino 【发布时间】:2019-04-07 15:33:07 【问题描述】:我从创建 arduino 库开始。包含已创建的库时出现错误。
这是为了将 DHT22 传感器库包含在另一个使用 Arduino Ide 的库中。
参考资料:
Arduino c++ classes, How to make instance variables of another class/library
https://www.arduino.cc/en/Hacking/LibraryTutorial
库 DHT22:
https://github.com/adafruit/DHT-sensor-library
使用过的文件:
此文件 tempaturaPOO.h
#ifndef temperaturaPOO_h
#define temperaturaPOO_h
#include "Arduino.h"
#include <DHT.h>
DHT dht(1, DHT22);
class temperaturaPOO
int sensor_humedad;
int sensor_temperatura;
public:
temperaturaPOO(int); // ?? x
void mostrar();
;
#endif
此文件 tempaturaPOO.cpp
#include <temperaturaPOO.h>
temperaturaPOO::temperaturaPOO(int pin)
DHT dht(pin, DHT22);
void temperaturaPOO::mostrar()
sensor_humedad = dht.readHumidity();
sensor_temperatura = dht.readTemperature();
Serial.print("Humidity:");
Serial.println(sensor_humedad);
Serial.print("Temperature:");
Serial.println(sensor_temperatura);
这个文件blinkLedPOO.ino
#include <temperaturaPOO.h>
temperaturaPOO temp(1); // se instancia
void setup()
Serial.begin(9600);
void loop()
temp.mostrar();
【问题讨论】:
tempaturaPOO.h 在哪里?它是在库文件夹中还是与 .ino 文件在同一文件夹中? 在库文件夹中。 程序如下:我创建了一个名为 temperaturePOO 的文件夹。里面有两个文件和一个文件夹,这个文件夹也有 temperaturePOO 的名称,里面只有文件 tempaturaPOO.ino。外面是文件: - tempaturaPOO.h - temperaturePOO.cpp 我所做的是压缩主文件文件夹,然后将其作为普通的 arduino 库导入。 你能告诉我为什么你的 .h 文件中有DHT dht(1, DHT22);
以及你在控制台中遇到什么错误吗?
在 C:\Users\Diego\AppData\Local\Temp\arduino_cache_455009\core\core_arduino_avr_nano_cpu_atmega328_0c812875ac70eb4a9b385d8fb077f54c.a 库\temperaturaPOO\temperaturaPOO. :在函数dht': (.text+0x0): multiple definition of
dht'sketch\temperaturaPOO.ino.cpp.o(来自插件的符号):(.text+0x0):首先在这里定义collect2.exe:错误:ld返回1退出状态退出状态1错误编译para la tarjeta Arduino Nano。
【参考方案1】:
“您遇到问题是因为您尝试多次定义DHT dht(1, DHT22);
。
试试这个: 你的 .h 文件应该是这样的
#ifndef temperaturaPOO_h
#define temperaturaPOO_h
#include "Arduino.h"
#include <DHT.h>
class temperaturaPOO
private:
DHT dht; //define dth here
int sensor_humedad;
int sensor_temperatura;
public:
temperaturaPOO(int); // ?? x
void mostrar();
;
#endif
和.cpp
#include "temperaturaPOO.h"
temperaturaPOO::temperaturaPOO(int pin)
dth = DHT(pin, DHT22);
void temperaturaPOO::mostrar()
sensor_humedad = dht.readHumidity();
sensor_temperatura = dht.readTemperature();
Serial.print("Humidity:");
Serial.println(sensor_humedad);
Serial.print("Temperature:");
Serial.println(sensor_temperatura);
【讨论】:
【参考方案2】:答案在one of the links you posted。 cmets 解释了如何在构造函数中初始化对象。当你传递一个成员构造函数时,你想使用initializer list。
标题应该是这样的。
#ifndef temperaturaPOO_h
#define temperaturaPOO_h
#include "Arduino.h"
#include <DHT.h>
class temperaturaPOO
int sensor_humedad;
int sensor_temperatura;
public:
temperaturaPOO(int);
void mostrar();
private:
DHT dht;
;
#endif
这是实现。看看dht
是怎么初始化的。
#include <temperaturaPOO.h>
temperaturaPOO::temperaturaPOO(int pin): dht(pin, DHT22)
void temperaturaPOO::mostrar()
sensor_humedad = dht.readHumidity();
sensor_temperatura = dht.readTemperature();
Serial.print("Humidity:");
Serial.println(sensor_humedad);
Serial.print("Temperature:");
Serial.println(sensor_temperatura);
【讨论】:
【参考方案3】:谢谢,成功了!!
我没有读取传感器数据,所以我在方法的开头添加了这两行,它可以正常工作。
温度POO.cpp
void temperaturaPOO::mostrar()
dht.begin(); // add this
delay(2000); // add this
sensor_humedad = dht.readHumidity();
sensor_temperatura = dht.readTemperature();
Serial.print("Humidity:");
Serial.println(sensor_humedad);
Serial.print("Temperature:");
Serial.println(sensor_temperatura);
我对构造函数的属性初始化有一个疑问:
你是怎么看这行的,换句话说,如何记录下来才能很好理解,谢谢!
这条线:
temperaturaPOO::temperaturaPOO(int pin): dht(pin, DHT22)
【讨论】:
以上是关于如何在arduino中制作另一个类库的实例变量的主要内容,如果未能解决你的问题,请参考以下文章