2015-02-13 2 views
2

Я пытаюсь построить простой термометр arduino, который загорается другим светодиодом в зависимости от температуры. Я использую брелоки adafruit 5v и 12 неопиксельных колец с температурным датчиком tmp36. Моя проблема в том, что загорается только индикатор 11. Я попытался изменить диапазон, чтобы проверить температуру, и я знаю, что моя комната холоднее, чем this.Here это код, я использую:Arduino led датчик температуры

#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); 

} 

Помощь была бы оценена. Спасибо :)

+0

пожалуйста, любой. Мне действительно нужна помощь. – user3880247

+2

Я не знаю точно, что делает ваш код, но я замечаю, что в вычислениях есть ** реальные ** значения и 'напряжение/= 1024', а затем умножение на 100 будет довольно грубым, работая с' int' , Должен ли вы использовать 'float' для всего этого, прежде чем перейти к' int'? –

+1

«Только светодиод 11 горит» означает, что при использовании вышеуказанного кода. Или это вообще. Я подозреваю, что начальный - действительно ли вы используете максимальный вход? Я бы отлаживал его в UNO, сначала печатал в коде, чтобы видеть номера, которые вы действительно получаете. Подозреваемая область может быть, вы не получаете максимальное количество из MAP. – mpflaga

ответ

1

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

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

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

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

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

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