Arduino:自定义库产生奇怪的行为
Arduino: Custom library produces strange behavior
我对 arduino 和 C++ 都比较陌生。我想制作一个植物浇水系统。我找到了这个 tutorial to measure soil moisture. It's in Czech, but you can find a piece of code to handle the moist sensor. This program runs without any problems. I have decidede to enclose this algorithm to a class so it's more readable to me. I followed arduinos tutorial to create custom library.
MoistSensor.h
#ifndef MoistSensor_h
#define MoistSensor_h
#include "Arduino.h"
class MoistSensor {
public:
MoistSensor(int analogPin, int digitalPin, int vccPin);
void measure();
int getMoisture();
void setup();
private:
int _analogPin;
int _digitalPin;
int _vccPin;
int _moisture;
void convertMoisture(int analogValue);
};
#endif
MoistSensor.cpp
#include "MoistSensor.h"
#include "Arduino.h"
MoistSensor::MoistSensor(int analogPin, int digitalPin, int vccPin) {
_analogPin = analogPin;
_digitalPin = digitalPin;
_vccPin = vccPin;
Serial.println("constructor ok: " + analogPin);
Serial.println("constructor ok: " + digitalPin);
Serial.println("constructor ok: " + vccPin);
};
int MoistSensor::getMoisture() {
return _moisture;
};
void MoistSensor::measure() {
digitalWrite(_vccPin, HIGH);
delay(100);
Serial.println("Value: " + analogRead(_analogPin));
digitalWrite(_vccPin, LOW);
};
void MoistSensor::convertMoisture(int analogValue) {
if (analogValue <= 230) {
_moisture = 100;
}
else if (analogValue >= 650) {
_moisture = 0;
}
else {
_moisture = 100 - ((analogValue - 230 ) / 4.2);
}
};
void MoistSensor::setup() {
pinMode(_analogPin, INPUT);
pinMode(_digitalPin, INPUT);
pinMode(_vccPin, OUTPUT);
digitalWrite(_vccPin, LOW);
};
Arduino 源代码:
#include <MoistSensor.h>
#define analogPin A0
#define digitalPin 3
#define vccPin 4
unsigned long time = 0;
MoistSensor sensor(analogPin, digitalPin, vccPin);
void setup() {
Serial.begin(9600);
sensor.setup();
}
void loop() {
if (millis() - time > 3000) {
sensor.measure();
time = millis();
}
}
我的程序产生的输出如下所示:
我 运行 在处理器 ATmega328P(旧引导加载程序)上的 Arduino NANO 上。
我不知道哪里出了问题。
所以问题就在这里
Serial.println("constructor ok: " + analogPin);
(以及您拥有类似代码的所有其他地方)。
您显然认为这会将 analogPin
转换为字符串并将其附加到 "constructor ok: "
。但事实并非如此。
你得到的是指针算法。字符串文字 "constructor ok: "
被转换为指针,并且 analogPin
的值被添加到该指针。在最好的情况下,这只会导致您打印原始字符串的一部分,在最坏的情况下,它会导致完全垃圾或崩溃。
试试这个
Serial.print("constructor ok: ");
Serial.println(analogPin);
我对 arduino 和 C++ 都比较陌生。我想制作一个植物浇水系统。我找到了这个 tutorial to measure soil moisture. It's in Czech, but you can find a piece of code to handle the moist sensor. This program runs without any problems. I have decidede to enclose this algorithm to a class so it's more readable to me. I followed arduinos tutorial to create custom library.
MoistSensor.h
#ifndef MoistSensor_h
#define MoistSensor_h
#include "Arduino.h"
class MoistSensor {
public:
MoistSensor(int analogPin, int digitalPin, int vccPin);
void measure();
int getMoisture();
void setup();
private:
int _analogPin;
int _digitalPin;
int _vccPin;
int _moisture;
void convertMoisture(int analogValue);
};
#endif
MoistSensor.cpp
#include "MoistSensor.h"
#include "Arduino.h"
MoistSensor::MoistSensor(int analogPin, int digitalPin, int vccPin) {
_analogPin = analogPin;
_digitalPin = digitalPin;
_vccPin = vccPin;
Serial.println("constructor ok: " + analogPin);
Serial.println("constructor ok: " + digitalPin);
Serial.println("constructor ok: " + vccPin);
};
int MoistSensor::getMoisture() {
return _moisture;
};
void MoistSensor::measure() {
digitalWrite(_vccPin, HIGH);
delay(100);
Serial.println("Value: " + analogRead(_analogPin));
digitalWrite(_vccPin, LOW);
};
void MoistSensor::convertMoisture(int analogValue) {
if (analogValue <= 230) {
_moisture = 100;
}
else if (analogValue >= 650) {
_moisture = 0;
}
else {
_moisture = 100 - ((analogValue - 230 ) / 4.2);
}
};
void MoistSensor::setup() {
pinMode(_analogPin, INPUT);
pinMode(_digitalPin, INPUT);
pinMode(_vccPin, OUTPUT);
digitalWrite(_vccPin, LOW);
};
Arduino 源代码:
#include <MoistSensor.h>
#define analogPin A0
#define digitalPin 3
#define vccPin 4
unsigned long time = 0;
MoistSensor sensor(analogPin, digitalPin, vccPin);
void setup() {
Serial.begin(9600);
sensor.setup();
}
void loop() {
if (millis() - time > 3000) {
sensor.measure();
time = millis();
}
}
我的程序产生的输出如下所示:
我 运行 在处理器 ATmega328P(旧引导加载程序)上的 Arduino NANO 上。
我不知道哪里出了问题。
所以问题就在这里
Serial.println("constructor ok: " + analogPin);
(以及您拥有类似代码的所有其他地方)。
您显然认为这会将 analogPin
转换为字符串并将其附加到 "constructor ok: "
。但事实并非如此。
你得到的是指针算法。字符串文字 "constructor ok: "
被转换为指针,并且 analogPin
的值被添加到该指针。在最好的情况下,这只会导致您打印原始字符串的一部分,在最坏的情况下,它会导致完全垃圾或崩溃。
试试这个
Serial.print("constructor ok: ");
Serial.println(analogPin);