image
Привет! Сегодня я предоставляю вашему вниманию термостат+ вольтметр для авто. У меня на авто ЗАЗ 1102 вечно ломается кран и я решил сделать вот такой термостат который будет включать электроклапан, но чтоб задействовать ми контроллер как-то еще, я решил добавить вольтметр.

И так начнем. Так-как это моя первая самоделка на LCD, то я немного расскажу как я начинал учить язык программирования.
Начинал я изучать язык СИ так как и все, с самого простого, миганием светодиодов ну и различные простенькие схемы, но я все ровно не мог понять как написать что-то серьезное в итоге я решил начать с более менее сложного устройства и тем самым собрать себе термостат+вольтметр на автомобиль, после двух недель мучения я наконец-то понял как это все работает и что такое программирование.
Поэтому для меня, как оказалось, лучше начинать изучать с более менее сложных устройств, теперь я хоть начал понимать о чем идет речь, но еще по прежнему слабый в этом деле. Как показала практика (лично для меня), то лучше начинать с тяжелого, а легкое само прейдёт. Может кому-то из начинающих эта статья поможет.
Пишу я в программе Codevisionavr, в этой программе есть готовые библиотеки и начальные термины в общем начинать в ней легче.

Пожалуй хватит обо мне пора начать рассматривать моё устройство, вот принципиальная схема.
image

Вот такая получилась у меня простенькая схема и проще как мне кажется уже некуда, самый главный здесь ми контроллер ATmega8 к которому подключен LCD дисплей 1602, что означает 16 символов и 2 ряда.
Резистор R1 служит для точной настройки выводимого напряжения на дисплей, а резистор R2 для настройки контрастности дисплея.
Дальше все просто три тактовые кнопки S1 S2 S3 для установки и сохранения температуры, рядом у нас установлен температурный датчик Даллас DS18B20 с подтягивающим резистором R3 в 4,7k.
Теперь мы рассмотрим питание самой схемы, для нормальной работы нам нужно подать на схему 5 вольт и не в коем случае больше, а то наш ми контроллер с дисплеем и температурным датчиком выйдут из строя, а как нам известно, мы это устройство будем использовать в автомобиле, а там 12 вольт.
Для этого я поставил всем известную кренку L7805, параллельно входу поставил конденсатор C2 ёмкостью в 0,047 мкФ и на выходе в 0,1 мкФ также на выходе стоит электролит ёмкостью в 1000 мкФ, после всего этого мы получаем стабилизированное питание 5 вольт.
Дальше рассмотрим узел управления эл.клапаном. Наш ми контроллер подает 5 вольт на опто-транзистор, но через ограничивающий резистор R4 после чего наш оптрон открывается и питание идет на затвор полевого транзистора VT1, полевик открывается и на наш эл. клапан подается полноценные 12 вольт. Резистор R5 служит для разряда затвора VT1 в тот момент когда оптрон закрылся, а диод VD1 служит для защиты полевого транзистора от всплесков.
И вот что получилось. Передняя часть.

image

И задняя часть.

image

Небольшое видео по работе данного устройства


На этом буду заканчивать, если где-то ошибки, прошу прощения. Всем пока и удачи!!!

Комментарии (18)


  1. shuvaevgl
    09.01.2016 21:08

    Хорошо бы увидеть прибор в действии — тогда это будет завершенная разработка.


    1. Ganch26
      09.01.2016 21:11

      Скоро будет уже устанавливаю в авто!


      1. shuvaevgl
        09.01.2016 21:29
        +4

        В следующий раз лучше материал подготовить в полной мере: читать будет интереснее, а проделанная Вами работа-нягляднее.


  1. qwerty1023
    10.01.2016 00:27

    Если на схеме все правильно нарисовано, не совсем понятно, как будет VT1 открываться.


    1. AlanDrakes
      10.01.2016 07:38

      Посмотрел схему. Ой-ей… Вот VT1 — это действительно. Я бы на месте автора поставил P-канальный MOSFET и подтягивал затвор к массе, а не вот так.
      По схеме транзистор в целом будет открываться, но окажется в режиме стабилизатора тока. Так как затвор притягивается к стоку, а при достаточном затворном напряжении, сопротивление канала будет стремиться к нулю, соответственно и разница напряжений между стоком и затвором, соответственно, транзистор будет закрвыаться… Ой-ой-ой. А это для схемы окажется фатальным вследствие выделения большого количества тепла на транзисторе.

      > после чего наш оптрон открывается и питание идет на затвор полевого транзистора VT1, полевик открывается и на наш эл. клапан подается полноценные 12 вольт.
      Полноценных 12V не будет в этой схеме.


      1. Ganch26
        10.01.2016 11:00

        Все работает ничего не греется и на выходе ровно столько сколько подал.


        1. AlanDrakes
          10.01.2016 12:01

          Не должно. Попробуйте нагрузить транзистор чем-то потребляющим несколько больший ток, а затем замерьте падение напряжения на нём. Так, как у Вас на схеме нарисовано, транзистор будет греться и поддерживать на себе падение напряжения в пределах 0.7~3V.


          1. qwerty1023
            10.01.2016 14:24
            +2

            Человека сложно переубедить, если он увидел, например, тестером, что все открывается и работает. Но имхо схемное решение выбрано абсолютно неправильно. Тут или ключ другой проводимости, оставив управление «плюсом», или той же проводимости, но тогда управлять «минусом», при этом, если подобрать правильный транзистор, то управлять можно прямо с ножки МК.


          1. qwerty1023
            10.01.2016 20:03

            Автор не хочет комментировать, а я себе уже мозг сломал :)

            AlanDrakes, возможно мы с вами были не правы. На схеме то нарисован транзистор со встроенным каналом, при отрицательном смещении на затворе он должен закрываться. Но все равно схема так себе… :)


            1. Carry
              10.01.2016 20:42

              Судя по описанию работы схемы канал там индуцированный да и встроенный — экзотика.
              Просто нарисовано как встроенный.


            1. Ganch26
              10.01.2016 22:56

              Да да все верно транзистор немного не дорисовал сори.


            1. AlanDrakes
              11.01.2016 17:19

              Тоже возможно.
              К сожалению, он не указан, так что мы с вами действительно гадаем на чайной гуще.
              Но встреная точка зрения всё же бывает полезной. Благодарю. =)


  1. Psychosynthesis
    10.01.2016 09:07

    Вот блин… купил пару месяцев назад на Али такие же индикаторы, а в сети все исходники для них на Ардуино. А я хотел сделать вариант на пике. Плюс мне ещё i2c отладить не на чем, потому в итоге я даже не могу со 100% вероятностью пройти процесс инициализации модуля — в сети валяется три варианта (один из старой PDF-ки по дисплеям 1602, другой из библиотеки для ардуино и третий из переводов с китайских спеков) стоит хоть что-то поменять в алгоритме, на экране билиберда, а где ошибся не понять…

    Никто не знает какой у них должен быть алгоритм инициализации и есть ли универсальный вариант?


    1. AlanDrakes
      10.01.2016 12:04

      Использую такой алгоритм для HD44780*

      Код
      // E = PORTB3
      // RS = PORTB2
      // R/W = PORTB1
      
      #define LCD_E		(1<<PORTB3)
      #define LCD_RS		(1<<PORTB1)
      #define LCD_RW		(1<<PORTB2)
      
      #define LCD_PORT_DDR	DDRB
      #define LCD_PORT	PORTB
      #define LCD_PORT_READ	PIND
      #define LCD_DATA_MASK	0xF0
      
      void LCD_SendNibble(char Nibble, char IsCMD)
      {
      	LCD_PORT_DDR |= LCD_DATA_MASK;	// OUT
      	if (IsCMD)
      	{
      		LCD_PORT &= ~LCD_RS;	// Instruction
      	} else {
      		LCD_PORT |= LCD_RS;	// Data
      	};
      	LCD_PORT &= ~LCD_RW;		// Write
      	LCD_PORT &= ~LCD_DATA_MASK;	// Data...
      	LCD_PORT |= (Nibble << 4);	// Actually, data
      	_delay_us(100);
      	LCD_PORT |= LCD_E;		// Strobe
      	_delay_us(300);
      	LCD_PORT &= ~LCD_E;		// Strobe end.
      	_delay_us(100);
      };
      
      void LCD_SendByte(char Data, char IsCMD)
      {
      	LCD_SendNibble(Data>>4, IsCMD);
      	LCD_SendNibble(Data & 0x0F, IsCMD);
      };
      
      char LCD_GetNibble(char IsCMD)
      {
      	char i;
      	LCD_PORT_DDR &= ~LCD_DATA_MASK;	// IN
      	LCD_PORT |= LCD_DATA_MASK;	// Pull-UP
      	if (IsCMD)
      	{
      		LCD_PORT &= ~LCD_RS;	// Instruction
      	} else {
      		LCD_PORT |= LCD_RS;	// Data
      	};
      	LCD_PORT |= LCD_RW;		// Read
      	_delay_us(100);
      	LCD_PORT |= LCD_E;		// Strobe
      	_delay_us(300);
      	LCD_PORT &= ~LCD_E;		// Strobe end.
      	_delay_us(100);
      	i = ((LCD_PORT_READ & LCD_DATA_MASK) >> 4);
      	return i;
      };
      
      char LCD_GetByte(char IsCMD)
      {
      	char i;
      	i = LCD_GetNibble(IsCMD);
      	i |= (LCD_GetNibble(IsCMD) >> 4);
      	return i & 0x80;
      };
      
      char LCD_IsBusy(void)
      {
      	return LCD_GetByte(1);
      };
      
      void LCD_Init(void)
      {
      	DDRB |= 0xFE;
      	while (LCD_IsBusy());
      	LCD_SendNibble(0x02, 1);
      	while (LCD_IsBusy());
      	LCD_SendByte(0x28, 1);
      	while (LCD_IsBusy());
      	LCD_SendByte(0x0F, 1);
      	while (LCD_IsBusy());
      	LCD_SendByte(0x06, 1);
      	while (LCD_IsBusy());
      	LCD_SendByte(0x80, 1);
      	while (LCD_IsBusy());
      };
      


    1. AlanDrakes
      10.01.2016 12:09

      Опять же, часть кода, который уже выводит текст на экран:

      Скрытый текст
      while (LCD_IsBusy());   // Дожидаемся, пока экран будет готов
      LCD_SendByte(0x85, 1);  // Переход на 1 знакоместо 1 строки
      for (t_val=0;t_val<i;t_val++) // Перебираем байты в массиве с текстом
      {
      	while (LCD_IsBusy()); // Снова пауза до готовности
      	LCD_SendByte(data2[t_val], 0); // Передаём символ
      }; // Цикл
      


  1. shtirlitsus
    11.01.2016 21:25
    -1

    слишком много восклицательных знаков.
    на R1 напряжение надо подавать через резистор. иначе неверное движение отвёрткой — и контроллер кончился.
    для чего оптопара? нет гальванической развязки же.
    да, и чего кроме такого ключа управления клапаном сомнительной схемотехники, автор хотел донести аудитории? фамилию при включении?


  1. Ganch26
    11.01.2016 22:24
    -1

    Ужас, вы в электронике вообще понимаете что нибудь?.. Куча глупых вопросов на которые даже отвечать не хочется!
    Удачи!!!


    1. shtirlitsus
      12.01.2016 11:17
      -1

      Согласен! Дискуссия будет бессмысленная.