Почему AnalogRead(A0) доставляет разные значения при вызове в файле библиотеки, а не при непосредственном вызове в скетче

Я хотел написать библиотеку, представляющую датчик, чтобы позже иметь массив датчиков. Я создал файл MoistureSensor.h:

#ifndef MoistureSensor_h
#define MoistureSensor_h

#include <Arduino.h>

class MoistureSensor {
  private:
    uint8_t sensPin;
    int sensValue;
    int sensId;

  public:
    MoistureSensor(uint8_t pin,int id);
    int getValue();
    int getId();
};

#endif

и MoistureSensor.cpp:

    // MoistureSensor.cpp
#include "MoistureSensor.h"

MoistureSensor::MoistureSensor(uint8_t pin, int id) {
  sensPin = pin;
  sensId  = id;
}

int MoistureSensor::getValue() {
  sensValue = analogRead(sensPin);
  return sensValue;
}
int MoistureSensor::getId() {
  return sensId;
}

это основной скетч, работающий на Arduino Mega:

#include "MoistureSensor.h"

MoistureSensor sens1("A0", 1);

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Value from analogread:");
  Serial.println(analogRead(A1));
  Serial.println("Value from library:");
  Serial.println(sens1.getValue());
  Serial.println("End");
  delay(1000);
  
}

Итак, когда я запускаю это, последовательный монитор показывает:

Value from analogread:
600
Value from library:
496
End

Почему это не выводит то же значение? Интерпретирует ли файл .cpp данные из analogRead() иначе, чем в скетче?

Кроме того, оба значения меняются вверх и вниз в зависимости от реакции датчика.

Заранее спасибо.

, 👍0

Обсуждение

это должно быть MoistureSensor sens1(A0, 1);, а не MoistureSensor sens1("A0", 1);. мы не пишем analogRead("A0"), @Juraj

Проще говоря, для вызова библиотеки требуется больше памяти. Когда вы читаете это в скетче, это одна линия. Если в библиотечной функции вам нужно вызвать библиотеку, это заставляет систему сохранять ее местоположение в оперативной памяти, а затем выполнять инструкцию. Вы выполняете еще много инструкций с библиотекой., @Gil


2 ответа


Лучший ответ:

2

При попытке скомпилировать ваш скетч я получаю следующее предупреждение компилятора:

warning: invalid conversion from 'const char*' to 'uint8_t {aka unsigned char}'
 MoistureSensor sens1("A0", 1);
                             ^
note:   initializing argument 1 of 'MoistureSensor::MoistureSensor(uint8_t, int)'

Это означает, что, хотя конструктор MoistureSensor() ожидал своего первый аргумент должен иметь тип uint8_t, вы указали const char* вместо. Действительно, строковый литерал типа "A0" распадается на const char* указатель, когда вы передаете его в качестве аргумента функции.

Исправление заключается в передаче фактического номера контакта вашему конструктору:

MoistureSensor sens1(A0, 1);

Но есть и вторая проблема. В тестовом скетче у вас есть Объект MoistureSensor читает A0, тогда как прямой analogRead() читает контакт A1. Если вы хотите получить такое же значение, вам следует прочитать тот же значок.

Примечание: изменение с uint8_t на byte абсолютно не имеет ничего общего с вашей проблемой. Эти два типа являются синонимами.

,

-1

Я нашел решение:

изменение параметра конструктора MoistureSensor::MoistureSensor(uint8_t pin, int id, int rawMax, int rawMin)`` от uint8_t tobyte решил эту проблему для меня. Я также изменил параметризацию на MoistureSensor sens1(1, 1);`

,

нет никакой разницы между byte и uint8_. это просто другое название одного и того же., @Juraj