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

В данном материале будет показано, как можно подключить PSoC4 к датчику температуры и влажности DHT11 по интерфейсу 1-Wire.
Интерфейс 1-wire является одним из обычно используемых протоколов для подключения небольших недорогих устройств, таких как цифровые датчики температуры и влажности. Этот протокол по своей сути похож на I2C, но в данном случае используется один информационный провод. Он специально разработан для низкой пропускной способности и низких скоростей передачи данных.
Для программирования PSoC4 воспользуемся средой Cypress PSoC Creator. Для того, чтобы создать проект нужно нажать Files - New – Project. Далее следует указать имя проекта и его расположение. После успешного создания проекта следует открыть TopDesign.cysch и добавить на рабочее пространство следующие компоненты: Digital Bidirectional Pin, UART(SCB mode), Bootloadable.

Теперь нужно настроить компонент bootloadble, для чего следует нажать на нем дважды левой кнопкой мыши. Появится окно, в котором нужно выбрать вкладку Dependancies. Здесь нужно выбрать директории HEX- и ELF-файлов, генерируемые средой для данного проекта.

Далее следует сконфигурировать компоненты Digital Pin и UART. Digital Pin, носящий название DHT, должен быть подтянут к питанию через резистор. Для этого следует выбрать Resstive Pull up в разделе Drive mode.

В UART нужно установить скорость 115200.

Теперь необходимо перераспределить линии ввода/вывода (GPIO), открыв Pins и с помощью выпадающего списка назначив:
UART\rx : P4[0]
UART\tx : P4[1]
DHT : P0[0]
Далее следует открыть шаблон основной программы main.c и вставить в нее сначала функцию считывания выходного сигнала датчика DHT11, которая приведена ниже.
static int temperature=99;
static int humidity=99;
int DHTread()
{
uint8 IState;
IState=CyEnterCriticalSection();
uint8 bits[5];
uint8 cnt = 7;
uint8 idx = 0;
int calc=0;
int timeout=0;
for (i=0; i< 5; i++)
bits[i] = 0;
DHT_Write(0u);
CyDelay(19);
DHT_Write(1u);
while(DHT_Read()==1)
{
timeout++;
if(timeout>500)
goto r99;
}
while(DHT_Read()==0)
{
timeout++;
if(timeout>500)
goto r99;
}
calc=timeout;
timeout=0;
while(DHT_Read()==1);
for (i=0; i<40; i++)
{
timeout=0;
while(DHT_Read()==0);
while(DHT_Read()==1)
timeout++;
//Data acquiring point
if ((timeout) > (calc/2))
bits[idx] |= (1 << cnt);
if (cnt == 0)
{
cnt = 7;
idx++;
}
else cnt--;
}
humidity = bits[0];
temperature = bits[2];
CyExitCriticalSection(IState);
CyDelay(1);
return 0;
r99:
humidity = 99;
temperature = 99;
CyExitCriticalSection(IState);
return 99;
}
Также нужно изменить функцию main следующим образом:
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
char outputstring[40];
UART_Start();
for(;;)
{
DHTread();
sprintf(outputstring,"Temperature=%i Humidity= %i \r\n");
UART_UartPutString(outputstring);
CyDelay(5000);
}
}
Скомпилируйте проект, загрузите файл с помощью Host Bootloader и наслаждайтесь совместной работой PSoC4 и DHT11.
© digitrode.ru