THERMOMETR LM75+WS2812b
- Войдите на сайт для отправки комментариев
Вс, 19/02/2017 - 02:30
Всем привет.
Сделал вот такой термометр.
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #include <Wire.h> #define sensor1 0x48 int c = 0; #define PIN 5 #define NUMPIXELS 41 #define INTENSITY 40 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 100; // delay for half a second void setup() { Serial.begin(9600); Wire.begin(); // Настройка регистра (Conf) Wire.beginTransmission(sensor1); //начать передачу (датчик 1); Wire.write(0x01); //написать (0x01); Wire.write(0x1C); // ВЫключение LM75 Wire.endTransmission(); //Конец передачи (); /* Настройка регистра гистерезиса (Thyst) адрес 0x02. */ Wire.beginTransmission(sensor1); //начать передачу (датчик 1); Wire.write(0x02); //написать (0x00); Wire.write(30); //написать (0x00); Wire.endTransmission(); //Конец передачи (); /* Настройка регистра гистерезиса (Tos) адрес 0x03. */ Wire.beginTransmission(sensor1); //начать передачу (датчик 1); Wire.write(0x03); //написать (0x00); Wire.write(35); //написать (0x00); Wire.endTransmission(); //Конец передачи (); pixels.begin(); // This initializes the NeoPixel library. } void loop() { // включение LM75 Wire.beginTransmission(sensor1); //начать передачу (датчик 1); Wire.write(0x01); //написать (0x01); Wire.write(0x1E); // включение LM75 Wire.endTransmission(); //Конец передачи (); delay(1000); // Запрос температуры Wire.beginTransmission(sensor1); //начать передачу (датчик 1); Wire.write(0x00); //написать (0x00); Wire.endTransmission(); //Конец передачи (); Wire.requestFrom(sensor1, 2); float c = (( (Wire.read() << 8) | Wire.read() ) >> 5) * 0.125; //int f=(c*9.0/5.0+32); Serial.print(c); Serial.println(" C"); // Serial.print(f); //Serial.println("F,"); //delay(1000); //Обнуление экрана for (int i = 0; i < NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // Moderately bright green color. } pixels.show(); // This sends the updated pixel color to the hardware. // Включение леда if (c < 10.5)pixels.setPixelColor(0, pixels.Color(0, 0, INTENSITY)); if (c >= 10.5 && c < 11.0)pixels.setPixelColor(1, pixels.Color(0, 0, INTENSITY)); if (c >= 11.0 && c < 11.5)pixels.setPixelColor(2, pixels.Color(0, 0, INTENSITY)); if (c >= 11.5 && c < 12.0)pixels.setPixelColor(3, pixels.Color(0, 0, INTENSITY)); if (c >= 12.0 && c < 12.5)pixels.setPixelColor(4, pixels.Color(0, 0, INTENSITY)); if (c >= 12.5 && c < 13.0)pixels.setPixelColor(5, pixels.Color(0, 0, INTENSITY)); if (c >= 13.0 && c < 13.5)pixels.setPixelColor(6, pixels.Color(0, 0, INTENSITY)); if (c >= 13.5 && c < 14.0)pixels.setPixelColor(7, pixels.Color(0, 0, INTENSITY)); if (c >= 14.0 && c < 14.5)pixels.setPixelColor(8, pixels.Color(0, 0, INTENSITY)); if (c >= 14.5 && c < 15.0)pixels.setPixelColor(9, pixels.Color(0, 0, INTENSITY)); if (c >= 15.0 && c < 15.5)pixels.setPixelColor(10, pixels.Color(0, 0, INTENSITY)); if (c >= 15.5 && c < 16.0)pixels.setPixelColor(11, pixels.Color(0, 0, INTENSITY)); if (c >= 16.0 && c < 16.5)pixels.setPixelColor(12, pixels.Color(0, 0, INTENSITY)); if (c >= 16.5 && c < 17.0)pixels.setPixelColor(13, pixels.Color(0, 0, INTENSITY)); if (c >= 17.0 && c < 17.5)pixels.setPixelColor(14, pixels.Color(0, 0, INTENSITY)); if (c >= 17.5 && c < 18.0)pixels.setPixelColor(15, pixels.Color(0, 0, INTENSITY)); if (c >= 18.0 && c < 18.5)pixels.setPixelColor(16, pixels.Color(0, INTENSITY, 0)); if (c >= 18.5 && c < 19.0)pixels.setPixelColor(17, pixels.Color(0, INTENSITY, 0)); if (c >= 19.0 && c < 19.5)pixels.setPixelColor(18, pixels.Color(0, INTENSITY, 0)); if (c >= 19.5 && c < 20.0)pixels.setPixelColor(19, pixels.Color(0, INTENSITY, 0)); if (c >= 20.0 && c < 20.5)pixels.setPixelColor(20, pixels.Color(0, INTENSITY, 0)); if (c >= 20.5 && c < 21.0)pixels.setPixelColor(21, pixels.Color(0, INTENSITY, 0)); if (c >= 21.0 && c < 21.5)pixels.setPixelColor(22, pixels.Color(0, INTENSITY, 0)); if (c >= 21.5 && c < 22.0)pixels.setPixelColor(23, pixels.Color(0, INTENSITY, 0)); if (c >= 22.0 && c < 22.5)pixels.setPixelColor(24, pixels.Color(0, INTENSITY, 0)); if (c >= 22.5 && c < 23.0)pixels.setPixelColor(25, pixels.Color(0, INTENSITY, 0)); if (c >= 23.0 && c < 23.5)pixels.setPixelColor(26, pixels.Color(0, INTENSITY, 0)); if (c >= 23.5 && c < 24.0)pixels.setPixelColor(27, pixels.Color(0, INTENSITY, 0)); if (c >= 24.0 && c < 24.5)pixels.setPixelColor(28, pixels.Color(0, INTENSITY, 0)); if (c >= 24.5 && c < 25.0)pixels.setPixelColor(29, pixels.Color(INTENSITY, 0, 0)); if (c >= 25.0 && c < 25.5)pixels.setPixelColor(30, pixels.Color(INTENSITY, 0, 0)); if (c >= 25.5 && c < 26.0)pixels.setPixelColor(31, pixels.Color(INTENSITY, 0, 0)); if (c >= 26.0 && c < 26.5)pixels.setPixelColor(32, pixels.Color(INTENSITY, 0, 0)); if (c >= 26.5 && c < 27.0)pixels.setPixelColor(33, pixels.Color(INTENSITY, 0, 0)); if (c >= 27.0 && c < 27.5)pixels.setPixelColor(34, pixels.Color(INTENSITY, 0, 0)); if (c >= 27.5 && c < 28.0)pixels.setPixelColor(35, pixels.Color(INTENSITY, 0, 0)); if (c >= 28.0 && c < 28.5)pixels.setPixelColor(36, pixels.Color(INTENSITY, 0, 0)); if (c >= 28.5 && c < 29.0)pixels.setPixelColor(37, pixels.Color(INTENSITY, 0, 0)); if (c >= 29.0 && c < 29.5)pixels.setPixelColor(38, pixels.Color(INTENSITY, 0, 0)); if (c >= 29.5 && c < 30.0)pixels.setPixelColor(39, pixels.Color(INTENSITY, 0, 0)); if (c >= 30.0 )pixels.setPixelColor(40, pixels.Color(INTENSITY, 0, 0)); pixels.show(); // This sends the updated pixel color to the hardware. // Выключение LM75 для экономии баттарейки Wire.beginTransmission(sensor1); //начать передачу (датчик 1); Wire.write(0x01); //написать (0x01); Wire.write(0x1D); // Выключение LM75 Wire.endTransmission(); //Конец передачи (); delay(2000); }
Все работает, но есть одна проблема. Схема потребляет 200мВт.
Двух батареек "АА" хватает на два дня.
Может у кого нибудь есть идея как снизить потребление схемы?
Прикольная идея.
Но с потреблением думаю дело плохо. Снизить то можна, а вот существенно снизить - нет. Ну поборите вы ток в 2-5 раз, получите работу 4-10 дней, это не выход. Светодиодам чтоб светится ток нужен, а переходить на вариант свечения по кнопке убет идею.
Я бы в такой ситуации делал питание от 220 через БП. Устройство ведь принципиально стационарное. Понимаю конечно, тянуть провод дело грязное и противное, но результат того стоит
К сожалению это не вариант. Дело в том что я приклеил термометр на стену на которой нигде нет питания. При отклеивании от стены оторвался кусок краски :). Так что место под него забронировано.
Это все отговорки ;) Если на планете есть розетка, то в неё можна всунуть. Что для этого потребуется - вопрос отдельный. Вариантов много, но надо рассмвтривать каждую конкретную ситуаци. Особо тяжелый - последний метр (от девайса до плинтуса) можна так делать:
1. понятно, штроб с ремонтом;
2. штроб без ремонта( аккуратно разрезам обои, штробим и аккуратно заклеиваем);
3. пробить дырку на другую сторону, если с той стороны проще использовать остальные способы.
4. Используем особо тонкий провод, менее 1 мм, типа таких как обмотки мотают, его просто вклеиваем под обои или краской поверху красим. Про изоляцию не думаем, т.к. на проводе 5В.
5. Маскируем провод художественным декором, например декоративная сосулька свисающая с термометра или плющ вющийся с земли заодно и провод прячет.
А дальше по плинтусу или под плинтусом куда хочеш тянется.
ПС. Если уж тянуть провод - то с запасом, кроме питания иметь еще и информационный канал. На потом. Потом подключить вторуб ардуинку и выводить на термрметр "шопопало" температуру на улице, прогноз температуры на завтра, день недели и пр..
А если включать индикацию по датчику движения, если есть кто то рядом. Или с периодом, по таймеру.
И яркость в темноте снижать можна, и ардуинку в слип, и её частоту и питание понизить, и светодиод выпаять... но все это существенно не поможет, чтоб получить ресурс хотяб в полгода.
2. штроб без ремонта( аккуратно разрезам обои, штробим и аккуратно заклеиваем);
Ну нет у меня обоев :)
кстати сейчас замерил токи по отдельности.
МК=31мА
LM75=0,11мА
Лед=21мА
Я немного в шоке. Не как не ожидал что МК потребляет 31мА.
Нужно его както в спячку отправить.
///Ну нет у меня обоев :)
Теперь будут! ;)
светод индикации питания сразу выпаяйте, стабилизатор питания ардуиновский выкиньте. Вобще на форуме эта тема хороше обсосана. Но смыслу в этих телодвижениях? Ну прикиньте, свели Вы потребление МК условно в 0. И что получится.
МК=31мА
LM75=0,11мА
Лед=21мА
Не реальные показания, как измеряете?
светод индикации питания сразу выпаяйте, стабилизатор питания ардуиновский выкиньте. Вобще на форуме эта тема хороше обсосана.
Logik
Вы наверное не обратили внимания на фото моей платы. У меня нет стабилизатора питания и нет леда индикации.
Ну прикиньте, свели Вы потребление МК условно в 0
К сожалению в 0 не получиться. Но я попробовал загнать МК в спячку, получаеться около 15мА то есть половина от того что он сейчас потребляет.
Вот только вывести его из "спячки" не получаеться :(
МК=31мА
LM75=0,11мА
Лед=21мА
Не реальные показания, как измеряете?
Почему не реальные?
Измеряю с помощью FLUKE.
Перерезал дорожки питания на каждом элементе в отдельности, в разрыв вставлял FLUKE.
Вообще я электронщик и как измерить ток я знаю :).
Поэтому "как настоящий электронщик" Вы открыли даташит на М328, посмотрели параметры, поняли что то не так в "Датском корлевстве" и сразу на форум :)
P.S. Я малые токи измеряю косвенным методом старым добрым В7-38. :(
Главным "возмутителем спокойствия" является постоянно тикающий таймер Т0. Некоторые функции Ардуино на нём завязаны, а многие библиотеки используют эти функции.
К сожалению в 0 не получиться. Но я попробовал загнать МК в спячку, получаеться около 15мА то есть половина от того что он сейчас потребляет.
Ну так я ж намисал Вам сразу.Да, можна урезать, даже в разы. Но это нич не даст в итоге. Будет батарей хватать не на 2 а на 3 суток. Ну и? Это тупиковый путь. Неужели это такая сложная мысль?!
Вот только вывести его из "спячки" не получаеться :(
Получится. Это возможно и много раз делалось.
Поэтому "как настоящий электронщик" Вы открыли даташит на М328, посмотрели параметры, поняли что то не так в "Датском корлевстве" и сразу на форум :)
P.S. Я малые токи измеряю косвенным методом старым добрым В7-38. :(
В даташит я нашел 2мА. Поэтому я так удивился.
Я также замерил ток на "ардуино про мини" причем несколькими мультиметрами. Показания различаються в приделах 5мА.
Что такое косвенные методы, впаять резистор и замерить на нем падение напряжения?
Сначала надо попробовать программу измерения с датчика без ленты. Получить самое минимальное потребление, а затем двигаться дальше. Самое минимальное что мне удалось получить от МК с одним датчиком около 30мкА. Я тогда отказался от стабилизаторов и использовал литиевую батарейку на 3.6 вольт. Только тогда писал на Си. Может стоит попробовать запитать МК и датчик от батареек, а ленту через преобразователь.