Почему 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()
иначе, чем в скетче?
Кроме того, оба значения меняются вверх и вниз в зависимости от реакции датчика.
Заранее спасибо.
@Nico Sz, 👍0
Обсуждение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
абсолютно
не имеет ничего общего с вашей проблемой. Эти два типа являются синонимами.
Я нашел решение:
изменение параметра конструктора
MoistureSensor::MoistureSensor(uint8_t pin, int id, int rawMax, int rawMin)`` от
uint8_t to
byte решил эту проблему для меня. Я также изменил параметризацию на
MoistureSensor sens1(1, 1);`
нет никакой разницы между byte и uint8_. это просто другое название одного и того же., @Juraj
- Использование аналогового входа для чтения кнопки
- Как сгенерировать файлы .a и .so для добавления в проект arduino
- Ardunio Mega/ATmega2560: использование порта F или K как для аналоговых входов, так и для цифровых выходов.
- Как использовать библиотеку Modbus RTU функционального кода 6
- Библиотека ESP8266: получено 2 запроса вместо 1
- Как правильно интерпретировать вывод встроенного аналого-цифрового преобразователя?
- Отображение значений с аналогового входа дает неожиданные значения?
- Проблема с SPI при использовании трансивера RF24 NRF24L01 со светодиодной матрицей MD_MAX72xx
это должно быть
MoistureSensor sens1(A0, 1);
, а неMoistureSensor sens1("A0", 1);
. мы не пишемanalogRead("A0")
, @JurajПроще говоря, для вызова библиотеки требуется больше памяти. Когда вы читаете это в скетче, это одна линия. Если в библиотечной функции вам нужно вызвать библиотеку, это заставляет систему сохранять ее местоположение в оперативной памяти, а затем выполнять инструкцию. Вы выполняете еще много инструкций с библиотекой., @Gil