如何在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中制作另一个类库的实例变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同appdomain的类库中调用实例方法?

arduino——串口通讯(笔记)

我应该如何在 Java 中初始化一个复杂的实例变量?

没有实例变量的表单

如何自己编写Arduino支持的C++类库

Arduino与Proteus仿真实例-4x4矩阵键盘驱动仿真