Термостат на ATmeg8 , LCD, DS18B20... делаем на CVAVR
Добавлено: Пн окт 24, 2011 19:10:37
Доброго времени.
Конечно этих термостатов как грязи, но когда он тебе нужен , схемы подходящей не найти.
Моя проба сделать своё конечно же постепенно заходит в тупик.
Вот моя начальная программа для МК
В данный момент это термостат , пороги срабатывания на температуру задаются из МК (это правильно так надо).
Далее что я хотел бы сделать, но у меня не получается:
Отображение температуры с десятыми, а также чтобы в исходнике можно было задавать значения
if ((temp >= 200) & (temp <= 232)) ..... (сейчас это if ((temp >= 20) & (temp <= 23))
И как сделать второй аналогичный термостат (с выводом данных температуры во вторую стороку).
Этот проект в протеусе и исходник в архиве. P.S.
В соседней ветке форума по подобному вопросу был дан совет
Котоварищи , гуру и начинающие , как говорится не проходите мимо, с интересом воспользуюсь вашей помощью и советами.
Конечно этих термостатов как грязи, но когда он тебе нужен , схемы подходящей не найти.
Моя проба сделать своё конечно же постепенно заходит в тупик.
Вот моя начальная программа для МК
Код: Выделить всё
#include <mega8.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <ds18b20.h>
#include <delay.h>
#include <stdio.h>
unsigned char lcd_buffer[10];
void main(void)
{
// Port B initialization
PORTB=0b00000000;
DDRB=0b11111100;
// Port C initialization
PORTC=0b10000000;
DDRC=0b00000000;
// Port D initialization
PORTD=0b00000000;
DDRD=0b00000000;
ACSR=0x80;
SFIOR=0x00;
w1_init();
lcd_init(16); //инициилизация LCD, и говорим что он на 16 символов
while (1) /* бесконечный цикл */
{
unsigned char devices; //переменная в которой количество присоеденённых датчиков
int temp; //переменная для хранения температуры
devices=w1_init(); //ищy датчики
//while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
if ((temp >= 20) & (temp <= 23)) // установим порог PORTB.6
PORTB.6 = 1;
else
if ((temp >= 25) & (temp <= 32)) // установим порог
PORTB.6 = 1;
else
{
PORTB.6 = 0;
}
if ((temp >= -12) & (temp <= -10)) // установим порог PORTB.7
PORTB.7 = 1;
else
if ((temp >= -16) & (temp <= -14)) // установим порог
PORTB.7 = 1;
else
{
PORTB.7 = 0;
}
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //на экран температуру и всё такое
lcd_clear(); //чистим дисплей перед выводом
//lcd_gotoxy(0,0);
lcd_puts(lcd_buffer); //выводим первую строку
/*/ формирование второй строки для вывода
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //на экран температуру и всё такое
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer); // выводим вторую строку с индикацией тока */
delay_ms(50); //ждём 50мс
};
}
}
В данный момент это термостат , пороги срабатывания на температуру задаются из МК (это правильно так надо).
Далее что я хотел бы сделать, но у меня не получается:
Отображение температуры с десятыми, а также чтобы в исходнике можно было задавать значения
if ((temp >= 200) & (temp <= 232)) ..... (сейчас это if ((temp >= 20) & (temp <= 23))
И как сделать второй аналогичный термостат (с выводом данных температуры во вторую стороку).
Этот проект в протеусе и исходник в архиве. P.S.
В соседней ветке форума по подобному вопросу был дан совет
Понятное дело вникнуть в кусок кода написаный мной займет какое то время, и размять прийдется не только пальцы, но ведь все вы когда то начинали, и вовремя оказанная помощь всегда большое дело.Это - при отсутствии исходников, да собственно как и с ними - минимум день работы с отладкой.
Платите за работу или сделайте сами.
Возможно, кто-то захочет размять пальцы и бесплатно, как бы его решение![]()
Котоварищи , гуру и начинающие , как говорится не проходите мимо, с интересом воспользуюсь вашей помощью и советами.

