Разделы

В сети

Пользователей: 186
Из них просматривают:
Аналоги: 69. Даташиты: 60. Инструкции: 1. Новости: 24. Остальное: 2. Ошибки: 5. Программы: 2. Производители: 1. Профиль пользователя: 1. Теги: 1. Форум: 19. Чат: 1.
Участников: 3
Гостей: 183

an , Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.
RGB температура

Измеряем температуру RGB лентой

Написал MACTEP 30.05.2020 19:20:00 (Просмотров: 2908)
На основе статьи об Ардуино (входы/выходы), соберем схему для замера температуры, используя датчик температуры LM35.


Сначала несколько измененная схема. Вместо переменного резистора подключен датчик LM35. Чем он хорош? От 0 до 100° на выходе будет напряжение от 0 до 1.0 В, с увеличением 10мВ на градус. При включении внутреннего опорного напряжения - практически идеальный датчик температуры, для замера от 0 до 100°.
 
Особенности датчиков LM35.
  • Значение температуры калибровано в шкале Цельсия.
  • Линейное значение напряжения на  выходе с коэффициентом 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°)
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
 Измеряем температуру RGB лентой
Технический Директор
Технический Директор
Дата регистрации: 08.02.2009
Откуда: Днестровск
Сообщений: 2116
не в сети
Думаю, неплохо бы смотрелись часы с цифрами из светодиодной ленты и, чтобы цвет цифр соответствовали температуре. Или ещё проще, например, обычные кварцевые электро-механические часы с подобной подсветкой циферблата по периметру или по типу зеркального туннеля.
Открыть изображение в новом окне
 Измеряем температуру RGB лентой
Технический Директор
Технический Директор
Дата регистрации: 08.01.2009
Откуда: Tallinn
Сообщений: 2276
не в сети
Да всё клссно.
 Измеряем температуру RGB лентой
Администратор
Администратор
Дата регистрации: 07.08.2008
Откуда: Тирасполь
Сообщений: 7021
не в сети
Цитата:
Да всё клссно.
Проверь, не говнокод?
 Измеряем температуру RGB лентой
Старший сотрудник
Старший сотрудник
Дата регистрации: 07.01.2010
Откуда:
Сообщений: 124
не в сети
Цитата:
Проверь, не говнокод?
Ну да!
Использование int там где достаточно uint8_t (не забываем AVR - 8-ми битный МК). А это вообще шедевр!
float konst = (valend valbeg) / 256.0;
Зачем здесь float? Для AVR все что больше 8 бит, уже приходится считать программно, а вы замахнулись на плавающую точку - тормоза обеспечены! Зачем деление? Задача решается гораздо проще и эффективнее
static uint16_t konst = (valend valbeg) >> 8;

Если нужна плавающая точка, берите МК поддерживающий ее. Они недорогие. Около 2.5$ за ардуино-подобную плату.
Открыть изображение в новом окне
 Измеряем температуру RGB лентой
Администратор
Администратор
Дата регистрации: 07.08.2008
Откуда: Тирасполь
Сообщений: 7021
не в сети
proger, я не программист, и настолько все тонкости не знаю.
А свои высеры можешь выкладывать на форуме программистов.
Твой пример со сдвигом работает, только если число делить надо на 2в какой то степени а дальше надо извращаться. А как ты думаешь, компилятор не то же самое сделает? Ну чуть побольше поизвращается...но для десяти строк кода и так сойдет.
Считаю твой высер только насчет int верным... остальное вытягивал...

Чет не пойму, ты чего за ресурсы МК борешься, да и за скорость, если там простейшая операция...

PS. пиши на ассемблере, будет тебе самый оптимальный код.
 Измеряем температуру RGB лентой
Старший сотрудник
Старший сотрудник
Дата регистрации: 07.01.2010
Откуда:
Сообщений: 124
не в сети
Для меня программирование тоже хобби.
Если разрабатываешь программы нужно знать как минимум основы. К ним относятся типы данных, общие принципы устройства и работы микроконтроллера и др. Речь обо всех ардуинщиках. Они плохо разбираются в программировании и тупо копируют друг от друга особо не задумываясь об оптимальности кода.
Деление на 256 эквивалентно сдвигу право на 8. Плавающая точка для этого не требуется.
Не важно простая программа или сложная. Если допускать нерациональное использование ресурсов МК в простых задачах, поступишь также в сложных. В итоге в устройстве будет несколько ардуин, но хватило бы одной при правильном построении алгоритма программы и рациональном использовании возможностей контроллера.
Асм платформозависим и слишком низкоуровневый. Современные оптимизирующие компиляторы дают выход не хуже чем ассемблерщик средней квалификации.
 Измеряем температуру RGB лентой
Администратор
Администратор
Дата регистрации: 07.08.2008
Откуда: Тирасполь
Сообщений: 7021
не в сети
С делением ты наверное не понял. На выходе может получитьсяч число с плавающей точкой. Там не обязательно целое число. Так как параметры температуры добавляются разные, то konst будет в том числе дробным. Если без плавающей запятой, то [цензура] получится, особенно если диапазон малый. Можно и по другому, но универсальности не будет.
 Измеряем температуру RGB лентой
V.I.P.
V.I.P.
Дата регистрации: 24.06.2011
Откуда: Мухосранск
Сообщений: 2576
не в сети
Круть

Разное

Купить мягкую мебель Вико в Киеве по доступным ценам

Интересно

Получить малозаметное и очень прочное соединение на молекулярном уровне можно, смочив треснувшую пластмассу ацетоном или нитрорастворителем.

Похожие статьи