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

Написание Кода Для Связки Atmega8+Dht11


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

Собственно, задание в заголовке.

Т.к. сам только начинающий специалист, ума коду не дал.

Есть мк atmega8, есть датчик dht11.

Под эту связку нужен код, который сможет мониторить показания датчика и, в зависимости от их состояния, выдавать сигнал на заданные выходы мк.

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

Код должен быть на си, с функцией проверки типа температуры t() и влажности h(), которую я сам потом смогу использовать уже в своем коде в дальнейшем.

Жду предложений.

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

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

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

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

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

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

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

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

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

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

Александр, нужен Си, т.к....

...ума коду не дал...

, а в итоге нужно...

...я сам потом смогу использовать уже в своем коде в дальнейшем...

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

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

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

Честно говоря, изучение авр-ок начал именно с асма. Но отсутствие быстрого и доступного аналога _delay_ms на данном этапе - единственный ограничивающий изучение ассемблера фактор

Мужчины, спасибо всем за пинок) полез копать ассемблер)

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

Из понимания сути передачи информации. Понимаю, как должно быть, но не понимаю, как, хотя отдельные (не очень объёмные, на секунду) блоки кода вполне поддаются освоению

Тему короче говоря можно считать закрытой. Для себя контакты нашёл нужные, знания приобрёл. Всем спасибо за участие

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

  • 10 месяцев спустя...

Привет всем!

Помогите пожалуйста переделать код, :umnik2: мне необходимо, чтобы МК (Atmega8) каждые 5 сек выводил значение (температуры и влажности) датчика (DHT11) на экран.

Код в таком виде выводит значение датчика только при запуске на экран и все, при изменении показателей датчика ничего не происходит :unknw: (код и схема в Proteus прилагается)

Заранее благодарю за помощь

компилятор используется AtmelStudio 6.2

файл dht11.c
#define F_CPU 1000000UL
#include <stdio.h>
#include <string.h>
#include <avr/io.h>
#include <util/delay.h>
#include "dht11.h"
#define DHT11_ERROR 255
/*
* get data from dht11-получить данные из DHT11
*/
uint8_t dht11_getdata(uint8_t select)
{
uint8_t bits[5];
uint8_t i,j = 0;
memset(bits, 0, sizeof(bits));
//reset port
DHT11_DDR |= (1<<DHT11_INPUTPIN); //output
DHT11_PORT |= (1<<DHT11_INPUTPIN); //high
_delay_ms(100);
//send request
DHT11_PORT &= ~(1<<DHT11_INPUTPIN); //low - низкая
_delay_ms(18);
DHT11_PORT |= (1<<DHT11_INPUTPIN); //high - высокая
_delay_us(1);
DHT11_DDR &= ~(1<<DHT11_INPUTPIN); //input - вход
_delay_us(39);
//check start condition 1 - начала проверки состояния 1
if((DHT11_PIN & (1<<DHT11_INPUTPIN)))
{
 return DHT11_ERROR;
}
_delay_us(80);

//check start condition 2 - начала проверки состояния 2
if(!(DHT11_PIN & (1<<DHT11_INPUTPIN)))
{
 return DHT11_ERROR;
}
_delay_us(80);
//read the data
for (j=0; j<5; j++) { //read 5 byte
 uint8_t result=0;
 for(i=0; i<8; i++) {//read every bit - читать каждый бит
  while(!(DHT11_PIN & (1<<DHT11_INPUTPIN))); //wait for an high input _ ждать высокой входной
  _delay_us(30);
  if(DHT11_PIN & (1<<DHT11_INPUTPIN)) //if input is high after 30 us, get result- если вход имеет высокий уровень после 30-ти нас, получить результат
   result |= (1<<(7-i));
  while(DHT11_PIN & (1<<DHT11_INPUTPIN)); //wait until input get low
 }
 bits[j] = result;
}
//reset port
DHT11_DDR |= (1<<DHT11_INPUTPIN); //output
DHT11_PORT |= (1<<DHT11_INPUTPIN); //low
_delay_ms(100);
//check checksum - проверять контрольную сумму

if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) {
 if (select == 0) { //return temperature - температура возвращаемого теплоносителя
  return(bits[2]);
 } else if(select == 1){ //return humidity - возвращение влажности
  return(bits[0]);
 }
}
return DHT11_ERROR;
}
/*
* get temperature (0..50C) - получить температуру
*/

int8_t dht11_gettemperature()
{

uint8_t ret = dht11_getdata(0);
if(ret == DHT11_ERROR)
 return -1;
else
 return ret;
}
/*
* get humidity (20..90%) - получить влажность
*/
int8_t dht11_gethumidity()
{

uint8_t ret = dht11_getdata(1);
if(ret == DHT11_ERROR)
 return -1;
else
 return ret;
}

файл dht11.h

#ifndef DHT11_H_
#define DHT11_H_

#include 
#include 

//setup parameters
#define DHT11_DDR DDRC
#define DHT11_PORT PORTC
#define DHT11_PIN PINC
#define DHT11_INPUTPIN PC5

extern int8_t dht11_gettemperature();
extern int8_t dht11_gethumidity();

#endif

файл mayn.c

#include 
#include 
#include "lcd_lib.h"
#include "dht11.h"
#include 


char buffer[8];

int main( void )
{

// Инициализация LCD
LCDinit();

// Выключаем курсоор
LCDcursorOFF();

// Очищаем дисплей
LCDclr();

int8_t temperature = 0;
int8_t humidity = 0;


while(1)
{

humidity = dht11_gethumidity();
temperature = dht11_gettemperature();

LCDGotoXY(0,0);
sprintf(buffer, "T=%02d", temperature);
LCDstring(buffer,4);

LCDGotoXY(0,1);
sprintf(buffer, "H=%02d", humidity);
LCDstring(buffer,4);

}

}

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

Почему-то так и происходит (см. "очередной" пост 12). Это как уметь виртуозно управлять автомобилем, но никогда не заглядывая под капот, в случае поломки на дороге, ждать эвакуатора,не имея возможности отремонтировать поломку самому, в дороге. Наверное поэтому в правах стали указывать "только с автоматической коробкой передач".

Не беру во внимание специалистов, прошедших всестороннее изучение МК.

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

Решение:

while(1)
{
...
_delay_ms(5000);
}

Вообще говоря, показания должны отображаться оперативно, а не только при запуске, т.к. опрос и вывод данных зациклены.

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

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

Почему-то так и происходит (см. "очередной" пост 12). Это как уметь виртуозно управлять автомобилем, но никогда не заглядывая под капот, в случае поломки на дороге, ждать эвакуатора,не имея возможности отремонтировать поломку самому, в дороге. Наверное поэтому в правах стали указывать "только с автоматической коробкой передач".

Не беру во внимание специалистов, прошедших всестороннее изучение МК.

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

Знание МК или микропроцессорного устройства определяется не умением программировать на ассемблере (впрочем как и ЯВУ, для него подходящего) этого МК, а в первую очередь знанием архитектуры этого МК и умением эти знания применять хоть на ассемблере, хоть на ЯВУ.

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

Если честно, не пойму тебя, marinovsoft, для чего поднимать высказанное год назад мнение. Поспорить? Это лишь мое мнение, сформировавшееся из наблюдений за участниками форума, начинающих программировать МК сразу на Си и объясняющих свой выбор "простотой" языка (якобы заморачиваться не надо). Но как показывает наблюдение, чаще всех задают "чайные" вопросы именно пишущие на Си.

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

Проехали. Замучал меня клиент сегодня. Вижу тему, читаю сообщения, а что сообщения некоторые устарели даже внимания не обратил.

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

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

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

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

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

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

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

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

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

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

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

    • А где в вышеприведённой схеме стоит КП103?
    • Установить диапазон измерения 200Ком. Один  крокодил мультиметра подключить к стоку, другой к истоку. Полярность подключения не имеет значения. Пальцем прикоснуться к затвору. При рабочем транзисторе мультиметр будет показывать меняющиеся показания. MMBF5459 имеет другой тип проводимост и может использоваться при изменённой полярности включения.
    • Затвор исток 700-600 ом что туда что туда,как понимаю он мерт 
    • ТС к чтению относится, как тот кот Васька ...
    • @_abk_ у да, раз речь шла про тиньки, давайте еще сайт микрочипа процитируем для полноты картины...  
    • Да, глянул я эту тему, вроде даже отметился в обсуждении, сейчас уже забыл что конкретно мне не понравилось, но в целом конструкция достойная. В голосовалке как-то её задавили минусами, несправедливо, на мой взгляд. МК там не на отображении, чисто так, сервисный. И их вообще два - один спаян с платы частотомера   Очень много ключиков, и схема нарисована в диптрейсе, вникать не стал, потому что неудобно для чтения, но скелет +/- понятен. sot-23 на 3 и шесть ног я ещё кое-как приловчился паять. В этих корпусах идут некоторые опорники и китайские чопперы (у них есть вариант в со-8 но он раза в два дороже в чипе). А вот 0805 - уже не мой размерчик, ограничиваюсь 1206, но и то, вы можете видеть, как криво сидят элементы.           По этой причине платка на ADS1210, отметившаяся на фотке выше, была отправлена в помойку. Увидел график нелинейности в даташите, цену на али, и заказал. Пришло, спаял платку, залез в секцию даташита "интерфейс", поковырялся, почитал форумы с обсуждениями подобных АЦП - не выдержал, выпаял всё, кроме АЦП, и провёл ему "видларизацию". Уж больно сложный интерфейс, у 7135 он весьма простой для работы с ардуинкой. Сейчас жду ADS1252 (АЦП близкий к тому, что был использован в В7-87, там ADS1251, немногим помедленнее, зато более линейный), но 7135 не бросаю, потихоньку полируя на ней "ядро" уффффф. Докинув чуть побольше денег можно купить ICL7104-16, которая представляет из себя то же самое, но с 16ти битным счётчиком и выходами под внешние буфер, интегратор и компаратор, что очень хорошо, т.к. можно поставить нормальные быстрые ОУ на полевиках и компарь типа LM311 хотяб.
    • угонял до 0,7 вольта, увы нет.... Транзисторы на плате КТ3102, цоколевка обратная по сравнению с 2N5551   Пересмотрел, реле не читается по фото. Стоит Omron G2RL-14E-12DC
×
×
  • Создать...