Цели и задачи.
1. Собрать устройство способное контролировать температуру в необходимом интервале с минимальными вложениями и знаниями в Avr
2. Принципиальная схема устройства
ССылка схемы в Proteus
3.Принцип работы:
Устройство имеет на борту семь светодиодов:
Три светодиода на порту C это индикаторы текущей температуры pc0 - синий светодиод температуры ниже заданной нормы pc1 - красный светодиод - температура выше на 2 градуса заданной нормы pc2 - желтый светодиод - температура находится в заданном интервале (t_min+2)
Четыре светодиода на порту D это индикаторы текущего режима (режимов пять) 0 - ни один светодиод не горит - минимальная температура t_min = 16 1 - горит первый светодиод - t_min = 18 2 - горят первый и второй светодиоды t_min = 20 3 - горят первый, второй и третий светодиоды t_min = 24 4 - горят все светодиоды t_min = 28
Минимальные температуры записаны в прошивке и отредактировать их можно только там...
Исходный код для прошивки Это так сказать модернизация вот этой статьи Простое термореле со светодиодной индикацией на Atmega8
Создадим новый проект с помощью мастера (Wizard). Выбираем микроконтроллер ATmega 8 потом в закладке 1-Wire выбираем порт В dsts bit = 0. File -> generate,save and exit. Сохраняем все проекты в CV стираем сгенерированный код и вставляем наш... Код //Еще в языке я полный ноль и это моя первая работа так что не судите строго... //Вопросы по прошивке принимаю http://vk.com/vityan92 на сайте PDA-NN.3dn.ru //Vityan.92@mail.ru power by Дымок®
#include <mega8.h> //подключаем библиотеки от меги #include <1wire.h> //Подключаем библиотеки от 1wire #include <ds18b20.h> //Подключаем библиотеки от DS18b20 #include <delay.h> #asm #endasm
eeprom char t_rezhs; //переменная с сохранением в eeprom
static flash unsigned char trezh[]= { //Создаем блок режимов (0b00000011), //0 (0b00001011), //1 (0b00011011), //2 (0b00111011), //3 (0b01111011), //4 };
void main(void) // Основная функция {
unsigned char devices, k, rezh; //ввобим переменные int temp, min_temp, i; devices = w1_init(); rezh = t_rezhs; PORTD = trezh[rezh]; //Включаем подтягивающее сопротивление на 1 и 2 лапке порта D DDRD =0b01111000; //Лапки порда D 3,4,5,6 на выход
PORTC = 0x00; //Выключаем весь порт C DDRC = 0b00000111; //Лапки порда С 0,1,2,на выход
while(devices>0) //если датчик обнаружен { k=0; //переменнй к присваиваем ноль if (!PIND.0){ //если нажата кнопка на порту D0 то входим в меню и выполняем цикл for десять раз for (i=0;i<10;i++) { delay_ms(100); //задержка от дребезка PORTD = 0b01111011; //зажигамем все лампочки на порту Д delay_ms(50); //задержка для красоты PORTD = 0b00000011; //тушим лампочки на порту D }; PORTD=0b00000011; //обнуляем порт D while (k<=2) { // запускаем цикл меню и он буде действовать пока переменная k будет меньше 3 k=1; //будем присваивать к к единице что бы не выходило из меню сама PORTD=trezh[rezh]; //порту D присвоим текущий режим из блока режимов while (!PIND.1) { //запускается цик при нажатие второй на порту кнопки D1 delay_ms(500); //задержка от дребезка rezh++; //добавляем единицу к режиму if (rezh==5)rezh=0; //если режим достиг 5 то его обнуляем PORTD = trezh[rezh]; //при сваиваем порту D выбранный режим }; delay_ms(100); //задержка if (!PIND.0){ //Снова нажимаем кнопку на порту D0 delay_ms(20); //задержка PORTD = 0b01111011; //далее пойдет визуализация сохранеия тупо моргаем лампочками выбора режима delay_ms(300); PORTD = 0b00111011; delay_ms(300); PORTD = 0b00011011; delay_ms(300); PORTD = 0b00001011; delay_ms(300); PORTD = 0b00000011; PORTD = trezh[rezh]; //при сваиваем порту D выбранный режим t_rezhs=rezh; //запоминаем номер режима в eeprom постоянную перезаписываемую память delay_ms(500); k=3; //присваеваем к 3 и выходим из меню настроек }; }; };
if (rezh==0) { //задаем температуры режимов если режим 0 то переменная min_temp будет 16 }; if (rezh==1) { //задаем температуры режимов min_temp=18; }; if (rezh==2) { //задаем температуры режимов min_temp=20; }; if (rezh==3) { //задаем температуры режимов min_temp=24; }; if (rezh==4) { //задаем температуры режимов min_temp=28; }; temp=ds18b20_temperature(0); //читаем температуру if (temp>1000) //если датчик выдаёт больше 1000 { temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" }
if (temp<min_temp) // устанавливаем нижней порог Синий диод PORTC.0 = 1; else PORTC.0=0; if (temp>=min_temp & temp<=min_temp+2) // устанавливаем рабочую температура Желтый PORTC.2 = 1; else PORTC.2 = 0; if (temp>min_temp+2) // установим верхний порог Красный PORTC.1=1; else PORTC.1=0; } while(devices<=0){ //моргаем диодами интервалов температур если отсутствует датчик PORTC.0 = 1; delay_ms(100); PORTC.2 = 1; delay_ms(100); PORTC.1 = 1; delay_ms(100); PORTC.0 = 0; delay_ms(100); PORTC.2 = 0; delay_ms(100); PORTC.1 = 0; delay_ms(100); ////добавим выбор режима в отсутствие датчика чтобы проверить работоспособность собранного устройства/////// k=0; //переменнй к присваиваем ноль if (!PIND.0){ //если нажата кнопка на порту D0 то входим в меню и выполняем цикл for десять раз for (i=0;i<10;i++) { delay_ms(100); //задержка от дребезка PORTD = 0b01111011; //зажигамем все лампочки на порту Д delay_ms(50); //задержка для красоты PORTD = 0b00000011; //тушим лампочки на порту D }; PORTD=0b00000011; //обнуляем порт D while (k<=2) { // запускаем цикл меню и он буде действовать пока переменная k будет меньше 3 k=1; //будем присваивать к к единице что бы не выходило из меню сама PORTD=trezh[rezh]; //порту D присвоим текущий режим из блока режимов while (!PIND.1) { //запускается цик при нажатие второй на порту кнопки D1 delay_ms(500); //задержка от дребезка rezh++; //добавляем единицу к режиму if (rezh==5)rezh=0; //если режим достиг 5 то его обнуляем PORTD = trezh[rezh]; //при сваиваем порту D выбранный режим }; delay_ms(100); //задержка if (!PIND.0){ //Снова нажимаем кнопку на порту D0 delay_ms(20); //задержка PORTD = 0b01111011; //далее пойдет визуализация сохранеия тупо моргаем лампочками выбора режима delay_ms(300); PORTD = 0b00111011; delay_ms(300); PORTD = 0b00011011; delay_ms(300); PORTD = 0b00001011; delay_ms(300); PORTD = 0b00000011; delay_ms(2000); PORTD = trezh[rezh]; //при сваиваем порту D выбранный режим t_rezhs=rezh; //запоминаем номер режима в eeprom постоянную перезаписываемую память k=3; //присваеваем к 3 и выходим из меню настроек }; }; }; }
}
Прошивка исходник для CodeVisionAVR >>>>
Схема печатной платы в Sprint Layout 5.0
Размер окружности взят специально под баночку из под крема NIVEA =)
Ссылка на схему
Список материалов:
1. Текстолит однослойный 100х100мм 2. Атмеga 8 в Dip28 корпусе 3. 7 светодиодов 5v цвета на ваше усмотрение (мои красный 1шт, синий 1шт, зеленый 1шт, белый 4 шт) 4. Резисторы 390ом 4шт, 4к7 5шт, 10к 1шт 5. Конденсаторы керамические 100nF (Маркируются 104) 6. Транзисторы типа n-p-n Я взял по мощнее КТ805 МБ 2 шт 7. Панелька под Atmega8 !!!обязательно!!! 8. Две кнопки без фиксации
ВНИМАНИЕ!!! СХЕМА НЕ ИМЕЕТ ВНУТРИСХЕМНОГО ПРОГРАММИРОВАНИЯ ATMEGA8 ПРОШИВАТЬ ОТДЕЛЬНО Для этого отлично подойдет ПРОГРАММАТОР ГРОМОВА+ ФОТО РАБОТЫ
Видео работы
Источник: http://pda-nn.3dn.ru/ |