LCD термометр со шкалой...

Тема в разделе "Глядите, что я сделал", создана пользователем Begemot, 24 янв 2016.

?

Достоен ли данный проект публикации в разделе "ВИКИ"?

  1. Да

    10 голосов
    100,0%
  2. Нет

    0 голосов
    0,0%
Можно выбрать сразу несколько вариантов.
  1. Begemot

    Begemot Нерд

    Принимайте еще одного энтузиаста!)))

    Сам проект относится к начальному уровню, но считаю его достойным публикации.
    Задача была сделать термометр с двустрочным дисплеем, куда будет выводиться цифровое значение температуры и шкала от 0 до 100 градусов...

    Проект создан на основе компонентов набора "Матрешка Z".
    Схему выкладывать не считаю нужным, ибо из кода всё и так понятно... Но,если скажете, что надо, - выложу...

    За основу взят начальные проекты "Метеостанция", "Тестер батареек", а также найденный в сети проект шкалы (http://www.electronics-lab.com/arduino-lcd-horizontal-progress-bar-using-custom-characters/)

    7e5aeed1-25ec-4c26-b22d-2dc6b4048304.jpg

    Код (C++):
    #include <math.h>
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(13, 12, 11, 10,  9,  8);
    #define TERMIST_B 4300
    #define VIN 5.0

    #define lenght 16.0
    unsigned char b;
    unsigned int peace;

    byte p1[8] = {
      0x10,
      0x10,
      0x10,
      0x10,
      0x10,
      0x10,
      0x10,
      0x10,};

    byte p2[8] = {
      0x18,
      0x18,
      0x18,
      0x18,
      0x18,
      0x18,
      0x18,
      0x18,};

    byte p3[8] = {
      0x1C,
      0x1C,
      0x1C,
      0x1C,
      0x1C,
      0x1C,
      0x1C,
      0x1C,};

    byte p4[8] = {
      0x1E,
      0x1E,
      0x1E,
      0x1E,
      0x1E,
      0x1E,
      0x1E,
      0x1E,};

    byte p5[8] = {
      0x1F,
      0x1F,
      0x1F,
      0x1F,
      0x1F,
      0x1F,
      0x1F,
      0x1F,};

    void setup()
    {
      lcd.createChar(0, p1);
      lcd.createChar(1, p2);
      lcd.createChar(2, p3);
      lcd.createChar(3, p4);
      lcd.createChar(4, p5);

      lcd.begin(16, 2);
      lcd.print("Temperature:");
    }

    void loop()
    {
      float voltage = analogRead(A0) * VIN / 1023.0;
      float r1 = voltage / (VIN - voltage);
      float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
      lcd.setCursor(12, 0);
      lcd.print(temperature, 1);

      lcd.setCursor(0, 1);
      double a=lenght / 100 * temperature;

      if (a>=1) {
         for (int i=1;i<a;i++)
           {
           lcd.write(4);
           b=i;
           }
         a=a-b;
                }
      peace=a*5;

      switch (peace) {
     
        case 0:
        break;
     
        case 1:
        lcd.print((char)0);
        break;
     
        case 2:
        lcd.print((char)1);
        break;
     
        case 3:
        lcd.print((char)2);
        break;
     
        case 4:
        lcd.print((char)3);
        break;
      }

      for (int i =0;i<(lenght-b);i++) {
        lcd.print(" ");
        }
    delay(500);
    }
     
    Последнее редактирование: 24 янв 2016
    Tomasina нравится это.
  2. Crazyday

    Crazyday Нерд

    Проект очень понравился. Собрал и опробовал. Хотелось бы, чтобы он попал на Амперка Вики и в книжку Конспект Хакера. Нарисовал для вас схему на макетке.
     

    Вложения:

  3. NE_XT

    NE_XT Гик

    Вообще-то применение сего в термометре в таком виде сомнительно, и есть специально "заточенная" библиотека LcdBarGraph шкалы, вот проектик для измерение уровня дерьма в выгребной яме.
     
  4. Begemot

    Begemot Нерд

    Безусловно! Но я позиционирую этот проект именно как начальный!)
    Ясное дело, что можно прикрутить эту библиотеку, а еще управлять дисплеем через регистр и т.д., но это уже не для новичков...
     
  5. sergeyv

    sergeyv Нуб

    Добрый день а может быть кто не будь подскажет, из за чего плавают показания температуры на 2-3 градуса?
     
  6. ostrov

    ostrov Гуру

    Датчик надо поточнее.
     
  7. sergeyv

    sergeyv Нуб

    меня смущает не точность показаний, а почему показания циклично прыгают (тоесть показание не стоит на месте)
     
  8. ostrov

    ostrov Гуру

    Потому и прыгает что датчик не точный.