Измеряем температуру RGB лентой
Сначала несколько измененная схема. Вместо переменного резистора подключен датчик LM35. Чем он хорош? От 0 до 100° на выходе будет напряжение от 0 до 1.0 В, с увеличением 10мВ на градус. При включении внутреннего опорного напряжения - практически идеальный датчик температуры, для замера от 0 до 100°.
- Значение температуры калибровано в шкале Цельсия.
- Линейное значение напряжения на выходе с коэффициентом 10 мВ/ °C.
- Гарантирована точность 0.5 °C (при 25 °C).
- Параметры нормированы для полного диапазона температур -55 … +150 °C.
- Удобны для использования в устройствах с удаленным подключением датчиков.
- Низкая цена.
- Работает в широком диапазоне напряжения питания 4 – 30 В.
- Потребляемый ток менее 60 мкА.
- Низкий уровень собственного разогрева – 0.08 °C при неподвижном воздухе.
- Нелинейность только ±0.25 °C.
- Низкое выходное сопротивление – 0.1 Ом, при токе нагрузки 1 мА.
Вот схема:
И измененный скетч. Изменения коснулись только включением внутреннего опорного напряжения 1.1В.
analogReference(INTERNAL);
int Pin9 = 9; // красный
int Pin10 = 10; // синий
int Pin11 = 11; // зеленый
int Pin3 = 3; // потенциометр подключен к входу 3
int val = 0; // переменная для хранения значения
int valbeg = 100; // начальное значение параметра (0-1023) обычно ближе к нулю
int valend = 380; // конечное значение параметра (0-1023)ближе к краю
// valbeg должен быть заведомо меньше valend
int pwm = 0; // переменная для хранения значения шим
float konst = (valend - valbeg) / 256.0; // Подсчитываем коэффициент
// Данный коэффициент нужен для того, чтоб вписать диапазон в 0-255 для ШИМ
void setup()
{
pinMode(Pin9, OUTPUT); // установка порта на выход
pinMode(Pin10, OUTPUT); // установка порта на выход
pinMode(Pin11, OUTPUT); // установка порта на выход
analogReference(INTERNAL); // Включаем внутреннее опорное напряжение 1.1В
}
void loop()
{
val = analogRead(Pin3); // считываем значение с порта 3,
pwm = (val - valbeg) / konst; // Полученные данные должны вписаться в 0-255 для вывода
if (pwm < 0) { pwm = 0; }; // если данные меньше, то 0
if (pwm > 255) { pwm = 255; }; // если данные больше, то 255
// Даже если параметры вышли за пределы, они обрежутся, и будет один из крайних цветов
if (pwm < 128)
{
analogWrite(Pin10, 255 - pwm * 2); //Выводим синий цвет
analogWrite(Pin11, pwm * 2); //Выводим зеленый цвет
analogWrite(Pin9, 0); // меньше середины красный не выводим
}
else
{
analogWrite(Pin9, pwm * 2 - 255); //Выводим красный цвет
analogWrite(Pin11, 510 - pwm*2 ); //Выводим зеленый цвет
analogWrite(Pin10, 0); // дальше середины синий не выводим
}
;
}
По скетчу.
int valbeg = 93; - указываем начальную температуру (10°)
int valend = 353; - указываем верхнюю температуру (38°)
Записываемые значения рассчитываются по формуле x=1023*t*10/1100
где:
x-нужные данные
1023 - значение при 1.1В
t*10 - температуру умножаем на 10, чтобы получить входное напряжение на выв.3
1100 - опорное напряжение в мВ
Можно вывести коэффициент, на который надо умножать градусы - x=t*9.3
Очень холодно (10°) | Холодно (17°) | Тепло (24°) | Жарко (31°) | Очень жарко (38°) |
Использование int там где достаточно uint8_t (не забываем AVR - 8-ми битный МК). А это вообще шедевр!
float konst = (valend - valbeg) / 256.0;
static uint16_t konst = (valend - valbeg) >> 8;
Если нужна плавающая точка, берите МК поддерживающий ее. Они недорогие. Около 2.5$ за ардуино-подобную плату.