Я пытаюсь создать простой термометр Arduino, который в зависимости от температуры загорается другим светодиодом. Я использую брелок Adafruit 5v и кольцо из неопикселя 12 с датчиком температуры tmp36. Моя проблема в том, что горит только светодиод 11. Я попытался изменить диапазон, чтобы проверить температуру, и я знаю, что моя комната холоднее, чем эта. Вот код, который я использую:
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#define PIN 3
#define NUMPIXELS 12
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500;
int sensorPin = 1;
void setup() {
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
pixels.begin();
}
void loop() {
int reading = analogRead(sensorPin);
int voltage = reading * 5.0;
voltage /= 1024;
int temp = (voltage - 0.5) * 100;
temp = constrain(temp, 23, 35);
temp = map(temp, 23, 35, 0, 11);
pixels.setPixelColor(temp, 0, 255, 38);
pixels.show();
delay(100);
}
Помощь будет высоко ценится.
Спасибо 🙂
Вам необходимо учитывать тип числа (int vs float), которое вы используете для своих расчетов. Математика, выполненная с целыми числами, будет усекать результаты с плавающей запятой. Функция Math.round () может помочь вам получить лучшие результаты от вашей математики.
Вы можете рассмотреть что-то вроде:
напряжение = Math.round (напряжение / 1024,0);
Операция деления будет выполняться с точностью с плавающей запятой, тогда вы получите округленный результат. Округление округляется в большую сторону (duh), если результат ближе к этому целочисленному значению, в противном случае округление вниз.
Кроме того, AnalogRead () возвращает значения от 0 до 1023. Если вы разделите это (с усечением) на 1024, вы никогда не получите 1024.
Я бы посоветовал взглянуть на примеры кода на сайтах Adafruit или Sparkfun, они дают хорошие примеры интерпретации термисторов / преобразователей термопар.