THERMOMETR LM75+WS2812b

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Всем привет.

Сделал вот такой термометр.

#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мВт.

Двух батареек "АА" хватает на два дня.

Может у кого нибудь есть идея как снизить потребление схемы?

Logik
Offline
Зарегистрирован: 05.08.2014

Прикольная идея.

Но с потреблением думаю дело плохо. Снизить то можна, а вот существенно снизить - нет. Ну поборите вы ток в 2-5 раз, получите работу 4-10 дней, это не выход. Светодиодам чтоб светится ток нужен, а переходить на вариант свечения по кнопке убет идею. 

Я бы в такой ситуации делал питание от 220 через БП. Устройство ведь принципиально стационарное. Понимаю конечно, тянуть провод дело грязное и противное, но результат того стоит

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

К сожалению это не вариант. Дело в том что я приклеил термометр на стену на которой нигде нет питания. При отклеивании от стены оторвался кусок краски :). Так что место под него забронировано.

Logik
Offline
Зарегистрирован: 05.08.2014

Это все отговорки ;) Если на планете есть розетка, то в неё можна всунуть. Что для этого потребуется - вопрос отдельный. Вариантов много,  но надо рассмвтривать каждую конкретную ситуаци. Особо тяжелый - последний метр (от девайса до плинтуса) можна так делать:

1. понятно, штроб с ремонтом;

2. штроб без ремонта( аккуратно разрезам обои, штробим и аккуратно заклеиваем);

3. пробить дырку на другую сторону, если с той стороны проще использовать остальные способы.

4. Используем особо тонкий провод, менее 1 мм, типа таких как обмотки мотают, его просто вклеиваем под обои или краской поверху красим. Про изоляцию не думаем, т.к. на проводе 5В.

5. Маскируем провод художественным декором, например декоративная сосулька свисающая с термометра  или плющ вющийся с земли заодно и провод прячет.

А дальше по плинтусу или под плинтусом куда хочеш тянется.

ПС. Если уж тянуть провод - то с запасом, кроме питания иметь еще и информационный канал. На потом. Потом подключить вторуб ардуинку и выводить на термрметр "шопопало" температуру на улице, прогноз температуры на завтра, день недели и пр..

alex_r61
Offline
Зарегистрирован: 20.06.2012

А если включать индикацию по датчику движения, если есть кто то рядом. Или с периодом, по таймеру.

Logik
Offline
Зарегистрирован: 05.08.2014

И яркость в темноте снижать можна, и ардуинку в слип, и её частоту и питание понизить, и светодиод выпаять... но все это существенно не поможет, чтоб получить ресурс хотяб в полгода.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Logik пишет:

2. штроб без ремонта( аккуратно разрезам обои, штробим и аккуратно заклеиваем);

Ну нет у меня обоев :)

кстати сейчас замерил токи по отдельности.

МК=31мА

LM75=0,11мА 

Лед=21мА

Я немного в шоке. Не как не ожидал что МК потребляет 31мА.

Нужно его както в спячку отправить.

Logik
Offline
Зарегистрирован: 05.08.2014

///Ну нет у меня обоев :)

Теперь будут! ;)

светод индикации питания сразу выпаяйте, стабилизатор питания ардуиновский выкиньте. Вобще на форуме эта тема хороше обсосана. Но смыслу в этих телодвижениях? Ну прикиньте, свели Вы потребление МК условно в 0. И что получится.

alex_r61
Offline
Зарегистрирован: 20.06.2012

Zahar пишет:

МК=31мА

LM75=0,11мА 

Лед=21мА

Не реальные показания, как измеряете?

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Logik пишет:

светод индикации питания сразу выпаяйте, стабилизатор питания ардуиновский выкиньте. Вобще на форуме эта тема хороше обсосана. 

Logik

Вы наверное не обратили внимания на фото моей платы.  У меня нет стабилизатора питания и нет леда индикации.

Logik пишет:

Ну прикиньте, свели Вы потребление МК условно в 0

К сожалению в 0 не получиться. Но я попробовал загнать МК в спячку, получаеться около 15мА то есть половина от того что он сейчас потребляет.

Вот только вывести его из "спячки" не получаеться :(

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

alex_r61 пишет:

Zahar пишет:

МК=31мА

LM75=0,11мА 

Лед=21мА

Не реальные показания, как измеряете?

Почему не реальные?

Измеряю с помощью FLUKE.

Перерезал дорожки питания на каждом элементе в отдельности, в разрыв вставлял FLUKE.

Вообще я электронщик и как измерить ток я знаю :).

alex_r61
Offline
Зарегистрирован: 20.06.2012

Поэтому "как настоящий электронщик" Вы открыли даташит на М328, посмотрели параметры, поняли что то не так в "Датском корлевстве" и сразу на форум :)

P.S. Я малые токи измеряю косвенным методом старым добрым В7-38. :(

alex_r61
Offline
Зарегистрирован: 20.06.2012

Главным "возмутителем спокойствия" является постоянно тикающий таймер Т0. Некоторые функции Ардуино на нём завязаны, а многие библиотеки используют эти функции.

Logik
Offline
Зарегистрирован: 05.08.2014

Zahar пишет:

К сожалению в 0 не получиться. Но я попробовал загнать МК в спячку, получаеться около 15мА то есть половина от того что он сейчас потребляет.

Ну так я ж намисал Вам сразу.Да, можна урезать, даже в  разы. Но это нич не даст в итоге. Будет батарей хватать не на 2 а на 3 суток. Ну и? Это тупиковый путь. Неужели это такая сложная мысль?!

Zahar пишет:

Вот только вывести его из "спячки" не получаеться :(

 

Получится. Это возможно и много раз делалось.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

alex_r61 пишет:

Поэтому "как настоящий электронщик" Вы открыли даташит на М328, посмотрели параметры, поняли что то не так в "Датском корлевстве" и сразу на форум :)

P.S. Я малые токи измеряю косвенным методом старым добрым В7-38. :(

В даташит я нашел 2мА. Поэтому я так удивился.

Я также замерил ток на "ардуино про мини" причем несколькими мультиметрами. Показания различаються в приделах 5мА.

Что такое косвенные методы, впаять резистор и замерить на нем падение напряжения?

alex_r61
Offline
Зарегистрирован: 20.06.2012

Сначала надо попробовать программу измерения с датчика без ленты. Получить самое минимальное потребление, а затем двигаться дальше. Самое минимальное что мне удалось получить от МК с одним датчиком около 30мкА. Я тогда отказался от стабилизаторов и использовал литиевую батарейку на 3.6 вольт. Только тогда писал на Си. Может стоит попробовать запитать МК и датчик от батареек, а ленту через преобразователь.