Arduino светодиодный датчик температуры

Я пытаюсь создать простой термометр 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);

}

Помощь будет высоко ценится.
Спасибо 🙂

2

Решение

Вам необходимо учитывать тип числа (int vs float), которое вы используете для своих расчетов. Математика, выполненная с целыми числами, будет усекать результаты с плавающей запятой. Функция Math.round () может помочь вам получить лучшие результаты от вашей математики.

Вы можете рассмотреть что-то вроде:

напряжение = Math.round (напряжение / 1024,0);

Операция деления будет выполняться с точностью с плавающей запятой, тогда вы получите округленный результат. Округление округляется в большую сторону (duh), если результат ближе к этому целочисленному значению, в противном случае округление вниз.

Кроме того, AnalogRead () возвращает значения от 0 до 1023. Если вы разделите это (с усечением) на 1024, вы никогда не получите 1024.

Я бы посоветовал взглянуть на примеры кода на сайтах Adafruit или Sparkfun, они дают хорошие примеры интерпретации термисторов / преобразователей термопар.

1

Другие решения


По вопросам рекламы [email protected]