Mạch đo nhiệt độ, độ
ẩm sử dụng FPGA
Nhóm 04
Phạm Hồng Đức : 20173762
Trần Anh Dũng : 20173785
Đào Văn Hào
: 20173838
Vũ Xuân Cừ
: 20173699
Giảng viên hướng dẫn : Ts. Nguyễn Đại Dương
Các nội dung chính
A
B
C
• Tổng quan về phần cứng
• Lưu đồ thuật tốn và
code
• Demo sản phẩm
Tổng quan về phần
cứng
Sơ đồ khối
Cảm
biến
nhiệt độ
Chip điều khiển
(FPGA)
Led cảnh báo
Mạch
hiển thị
Kit FPGA EPM240
Mạch hiển thị
› Sử dụng IC 74LS47
kết hợp vớ led 7
thanh
Cảm biến nhiệt độ DHT22
› Điện áp hoạt động 5V
› Khoảng đo độ ẩm : 0% 100% RH sai số 2% RH
› Khoảng đo nhiệt độ : -40
80 độ C sai số 0.5% độ C
Cách đọc nhiệt độ từ cảm biến DHT22
start
DHT_resp
start_data
wait_DHT_resp
DHT_pullup
trans_bit
trans_bit
start_data
compare : start_data > trans_bit ?
Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T
data + 8bit decimal T data + 8bit check sum
Mạch nguyên lý
DHT22
Lưu đồ thuật toán và
code
Lưu đồ thuật toán
Code VHDL
library ieee;
use ieee.std_logic_1164.all;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DemoDHT is
generic (
clk_period_ns : positive := 20; -- 50mhz
data_width: positive:= 8);
port(
clk: in std_logic ;
dht_bus: inout std_logic;
dataout: out std_logic_vector(7 downto 0);
led : out std_logic_vector(3 downto 0);
key_in : in std_logic
);
end entity;
Code VHDL
architecture rtl of DemoDHT is
constant delay_18_ms: positive := 18*10**6/clk_period_ns+1;
constant max_delay : positive := 500*10**6/clk_period_ns+1; -- 500 ms
constant N: integer :=70;
type arr is array (1 to N) of std_logic_vector(7 downto 0);
constant datas : arr := (X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"29",
X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"38",X"39",
X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",
X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",
X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",
X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",
X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89");
signal input_sync : std_logic_vector(0 to 2);
type state_type is (start,wait_DHT_resp,DHT_resp,DHT_pullup,startdata,prepare,trans_bit,compare,display);
signal state : state_type;
signal delay_counter : natural range 0 to max_delay;
signal delay_counter2 : natural range 0 to max_delay;
signal delay_temp : natural range 0 to max_delay;
signal data_out : std_logic_vector (data_width-1 downto 0);
signal bus_rising_edge, bus_falling_edge : boolean;
signal number_bit : natural range 0 to 24;
signal temp : integer range 0 to 50;
signal dem : integer range 8 to 24;
Code VHDL
begin
edge : process(clk) begin
if rising_edge(clk) then
input_sync <= to_x01(dht_bus)&input_sync(0 to 1);
end if;
end process;
bus_rising_edge <= input_sync(1 to 2) = "10";
bus_falling_edge <= input_sync(1 to 2) = "01";
Code VHDL
DHT22:process (clk)
begin
if rising_edge(clk) then
case(state) is
when start =>
if key_in = '0' then
if dem = 24 then
dem <= 8;
else
dem <= 24;
end if;
end if;
temp <= 0;
if delay_counter = 0 then
number_bit <= dem;
dht_bus <= '0';
delay_counter <= delay_18_ms;
state <= wait_DHT_resp;
else
delay_counter <= delay_counter - 1;
end if;
when wait_DHT_resp =>
if delay_counter = 0 then
dht_bus <= 'Z';
state <= DHT_resp;
else
delay_counter <= delay_counter -1;
end if ;
when DHT_resp =>
if bus_falling_edge then -state <= DHT_pullup;
end if;
when DHT_pullup =>
if bus_rising_edge then
state <= startdata;
end if;
when startdata =>
if bus_falling_edge then
state <= prepare;
end if;
Code VHDL
when prepare =>
if bus_rising_edge then
delay_counter <= delay_temp;
state <= trans_bit;
delay_temp <= 0;
else
delay_temp <= delay_temp + 1;
end if;
if number_bit = 0 then
temp <= CONV_INTEGER(data_out);
state <= display;
end if;
when trans_bit =>
if bus_falling_edge then
delay_counter2 <= delay_temp;
state <= compare;
delay_temp <=0;
else
delay_temp <= delay_temp + 1;
end if;
when compare =>
number_bit <= number_bit - 1;
if(delay_counter > delay_counter2) then
data_out <= data_out(data_width -2 downto 0) & '0';
else
data_out <= data_out(data_width -2 downto 0) & '1';
end if;
state <= prepare;
when display =>
if delay_counter = 0 then
delay_counter <= max_delay;
state <= start;
else
dataout <= datas(temp -19);
delay_counter <= delay_counter - 1;
if temp > 45 then
led <= "0000";
else
led <= "1111";
end if;
end if;
end case;
end if;
end process DHT22;
Demo sản phẩm
/>CoJaazZ0NqYo4Vsn4BApsq8_?usp=sharing