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);