Arduino: пользовательская библиотека вызывает странное поведение - PullRequest
0 голосов
/ 11 июля 2020

Я новичок в Arduino, а также в C ++. Хочу сделать систему полива растений. Я нашел этот учебник по измерению влажности почвы . Он на чешском, но вы можете найти код для работы с датчиком влажности. Эта программа работает без проблем. Я решил включить этот алгоритм в класс, чтобы он был более читабельным для меня. Я следил за учебником arduinos, чтобы создать собственную библиотеку .

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

Результат моей программы выглядит так: введите описание изображения здесь

Я использую Arduino NANO на процессоре ATmega328P (старый загрузчик).

Понятия не имею, что может быть не так.

1 Ответ

1 голос
/ 11 июля 2020

Итак, проблема здесь

Serial.println("constructor ok: " + analogPin);

(и во всех других местах, где у вас есть похожий код).

Очевидно, вы думаете, что это преобразует analogPin в строка и добавьте ее в "constructor ok: ". Но это не то, что происходит.

Вместо этого вы получаете арифметику указателя c. Строковый литерал "constructor ok: " преобразуется в указатель, и к этому указателю добавляется значение analogPin. В лучшем случае это приведет к печати только части исходной строки, в худшем - к полному мусору или крэ sh.

Попробуйте вместо этого

Serial.print("constructor ok: ");
Serial.println(analogPin); 
...