Перейти к содержанию

Термометр


Рекомендуемые сообщения

Всем здравствуйте!

прошу помощи тк как я только учусь)))

вот код - собран из разных исходников и работает, но есть вопрос, который я так и не могу решить, точнее понять сути((

#include <mega8.h>               //библиотека ввода\вывода
#include <delay.h>               //библиотека задержки
#asm                             //сообщаем куда подключен датчик
       .equ __w1_port=0x15; PORTC
       .equ __w1_bit=3
#endasm                  
#asm                             //сообщаем куда подключён экран
   .equ __lcd_port=0x18
#endasm
#include <lcd.h>                 //библиотека для LCD
#include <1wire.h>               //библиотека работы с 1Wire
#include <ds18b20.h>             //библиотека для работы с датчиком ds18b20
#include <stdio.h>               //ненаю что за библиотека, но без неё неполучается
unsigned char buffer_1[16]={'T','E','R','M','O','M','E','T','R'};
unsigned char rom_code[8][9];    //масив с адресами найденых датчиков
char lcd_buffer[33];             //масив с данными для экрана
void main(void)                  
{
unsigned char devices, i;        //переменная в которой количество присоеденённых датчиков, и номер выбранного датчика
int temp;                        //переменная для хранения температуры
lcd_init(16);                    //инициилизация LCD, и говорим что он на 16 символов
PORTD = 0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D
DDRD = 0xFF; 

PORTC.0=1;
devices=w1_search(0xf0,rom_code);   //ищим датчики, и записуем их адреса в масив
lcd_puts(buffer_1);
delay_ms(500);          
while(devices>0)                 //бесконечный цикл, если датчик подключон
     {   
         if(!PINC.0){           //Если нажата кнопка
             i++; 
                           //Увиличиваем переменную "i" на 1
             delay_ms(300);     //Ждём 300мс для "анти-дребезга"
         }
         if(i>=devices){        //Если "i" больше или равно найденым датчикам
         i=0;                   //тогда "i" равно нулю
         }
         temp=ds18b20_temperature(&rom_code[i][0]);  //читаем температуру с выбранного датчика
         if (temp>1000){               //если датчик выдаёт больше 1000
            temp=4096-temp;            //отнимаем от данных 4096
            temp=-temp;                //и ставим знак "минус"

         }
     if (temp<0)                          // устанавливаем нижней порог
        PORTD.0 = 1;    
        else PORTD.0=0;
      if (temp>1)                         // установим верхний порог
         PORTD.1=1;
      else PORTD.1=0;


         sprintf(lcd_buffer,"TEMP=%i.%u\xdfC",temp,temp%1);    //записуемв масив для экрана температуру и всё такое

        lcd_clear();                  //чистим дисплей перед выводом


         lcd_puts(lcd_buffer);         //выводим масив на LCD
         delay_ms(500);                //ждём 500мс
     };
}

как в данный код прикрутить функцию - которая по нажатию кнопки не только переключалась на другой датчик(у меня их 3) но и добавляла надпись на дисплей например дом улица и тд - что бы знать с какова датчика идет сигнал

всем заранее спасибо))

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

if (temp>1000){ //если датчик выдаёт больше 1000

temp=4096-temp; //отнимаем от данных 4096

temp=-temp; //и ставим знак "минус"

}

Довольно странная конструкция, но если работает - пусть будет.

Возможно подойдет чтото вроде

********************************
   PORTD.1=1;
      else PORTD.1=0;

// sprintf(lcd_buffer,"TEMP=%i.%u\xdfC",temp,temp%1);    //записуемв масив для экрана температуру и всё такое
// это перенесем пониже, здесь - закомментируем
        lcd_clear();                  //чистим дисплей перед выводом
////// добавленный код /////////////////////////////////////////////
        if(i==0)sprintf(lcd_buffer,"1-U JLAT4UK");else
        if(i==1)sprintf(lcd_buffer,"2-U JLAT4UK");else
        if(i==2)sprintf(lcd_buffer,"3-U JLAT4UK");else sprintf(lcd_buffer,"OWU6KA B nporpamme");
// в lcd_buffer пишем номер датчика. Я контроллерного Си и дисплея
//         не знаю, может он и поддерживает русский шрифт,
//         поэтому написал транслитом. При желании можно переделать на англ. язык
        lcd_puts(lcd_buffer);
// аналогично вашей процедуре, вывод информации о номере датчика. Дальше, наверное, нужен перевод строки
//         но с этим вы разберетесь быстрее чем я.
        sprintf(lcd_buffer,"TEMP=%i.%u\xdfC",temp,temp%1);
// Вывод значения датчика (см выше) перенесем сюда
////////////////////////////////////////////////////////////////////
         lcd_puts(lcd_buffer);         //выводим масив на LCD
         delay_ms(500);                //ждём 500мс
     };
}

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

<stdio.h> это стандартная Си библиотека ввода вывода.

Объяви переменную char: char ukaz;

Вставь после else PORTD.1=0;

if ( i == 0 ) ukaz = 'U'; - улица

if ( i == 1 ) ukaz = 'D'; - дом

if ( i == 2 ) ukaz = 'S'; - температура внутри системника компа или что надо.

Строку sprintf(lcd_buffer,"TEMP=%i.%u\xdfC",temp,temp%1); надо изменить на

sprintf(lcd_buffer,"%c TEMP=%i.%u\xdfC",ukaz,temp,temp%1);

Если хочешь можешь оформить эти условия в функцию, также вместо if можно использовать switch case, короче вот так.

Будьте проще и люди к вам потянутся.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо большое так и думал , просто не знал повлияют ли еще доп дейсвие над переменной на точность результата

а конструкция минус 4096 - это только для DS18B20 - по даташиту иначе он минус не показывает

экспериментирую дальше))))))

Ссылка на комментарий
Поделиться на другие сайты

Ты ведь производишь действия не с переменной temp, в которой хранится значение температуры, так что не повлияет.

Будьте проще и люди к вам потянутся.

Ссылка на комментарий
Поделиться на другие сайты

А сравнение переменной с числом ее (переменную) не меняет.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А какой-нибудь язык программирования знаете? Вроде ни в одном сравнение не меняет аргумент.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

По Си рекомендую книгу "Программирование на языке Си" автор Стефан Кочан, третье издание, отличная книга, всё разжёвано до предела, читается очень легко все примеры разобраны прям по строчно, где, что и как.

Будьте проще и люди к вам потянутся.

Ссылка на комментарий
Поделиться на другие сайты

Лучше с Асма, логика работы его программы более приближена к логике кристалла. Начинать точно лучше с него, тогда Си покажется безобидным и не страшным :-) Правда где найти книжку по началам асма - не знаю.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

К сожалению в электронке у меня её нету, но советую лучше купить бумажный вариант, у меня она всегда на столе лежит как справочник, потому что нет, нет да и забуду, что-нибудь, стоит в инете 250 рублей: http://www.home-relax.ru/good_book_1070766_3036814.html

Лучше с Асма, логика работы его программы более приближена к логике кристалла. Начинать точно лучше с него, тогда Си покажется безобидным и не страшным :-) Правда где найти книжку по началам асма - не знаю.

Кому как, мне так асм ни разу не понадобился всё время как-то Си хватало да я и не разрабатываю промышленные устройства. А когда говорят, что надо учить асм, чтобы понять устройство мк, то я могу то же сказать и про Си, устройство мк знать просто необходимо в любом случае. К тому же бытует мнение, что авр затачивались прямо таки под Си, не утверждаю т.к самому мне по душе ближе как-то PIC-и :rolleyes:, но в инете часто видел такие мнения.

Будьте проще и люди к вам потянутся.

Ссылка на комментарий
Поделиться на другие сайты

авр затачивались прямо таки под Си
А это как? Ведь как работает Си? Он преобразует входной код (в несколько этапов) в ассемблерный, а потом этот ассемблерный - в машинный, в чем можно убедиться, посмотрев файлы, которые он выдает (в AVR studio - *.lss). Но, конечно, отличия там не столь существенны, особенно для простых применений (светодиодиками там поморгать или еще что), как для "компьютрного" Си.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Сам найдеш?

Надеюсь это не мне а flair007'y? :)

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Всем конечно спасибо - но чет я не понял про этот флуд я спросил про конкретную книгу! И на знание этого форума могу поспорить со многими завсягдатами )) так - как сам им являюсь

и с языком я определился - сейчас на конкретных примерах углубляюсь в мат. часть!

Ссылка на комментарий
Поделиться на другие сайты

Тыц

Тыц

Тыц

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

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...