Измеряем температуру 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$ за ардуино-подобную плату.
А свои высеры можешь выкладывать на форуме программистов.
Твой пример со сдвигом работает, только если число делить надо на 2в какой то степени а дальше надо извращаться. А как ты думаешь, компилятор не то же самое сделает? Ну чуть побольше поизвращается...но для десяти строк кода и так сойдет.
Считаю твой высер только насчет int верным... остальное вытягивал...
Чет не пойму, ты чего за ресурсы МК борешься, да и за скорость, если там простейшая операция...
PS. пиши на ассемблере, будет тебе самый оптимальный код.
Если разрабатываешь программы нужно знать как минимум основы. К ним относятся типы данных, общие принципы устройства и работы микроконтроллера и др. Речь обо всех ардуинщиках. Они плохо разбираются в программировании и тупо копируют друг от друга особо не задумываясь об оптимальности кода.
Деление на 256 эквивалентно сдвигу право на 8. Плавающая точка для этого не требуется.
Не важно простая программа или сложная. Если допускать нерациональное использование ресурсов МК в простых задачах, поступишь также в сложных. В итоге в устройстве будет несколько ардуин, но хватило бы одной при правильном построении алгоритма программы и рациональном использовании возможностей контроллера.
Асм платформозависим и слишком низкоуровневый. Современные оптимизирующие компиляторы дают выход не хуже чем ассемблерщик средней квалификации.