DHT11温度传感器
下面是Uno上能用的,直接使用AVR的端口号,注意与arduino的区别

#include <avr/io.h> #define DHT11_PIN 5 void setup() { DDRC|=_BV(DHT11_PIN); PORTC|=_BV(DHT11_PIN); Serial.begin(9600); delay(300); Serial.println("\nDHT11 - A Digital humidity and temperature sensor\n"); delay(700); } void loop() { double t=0; double h=0; bool isOK=false; //===Test======== isOK=readDHT11Data(t,h); delay(2000); } //================DHT11 Code================== bool readDHT11Data(double &t,double &h){ t=-888; h=-888; byte dht11_dat[5]; byte dht11_in; byte i; PORTC &= ~_BV(DHT11_PIN); delay(18); PORTC|=_BV(DHT11_PIN); delayMicroseconds(40); DDRC &= ~_BV(DHT11_PIN); delayMicroseconds(40); dht11_in = PINC & _BV(DHT11_PIN); if(dht11_in) { Serial.println("dht11 start condition 1 not met"); return false; } delayMicroseconds(80); dht11_in=PINC & _BV(DHT11_PIN); if(!dht11_in) { Serial.println("dht11 start condition 2 not met"); return false; } delayMicroseconds(80); for(i=0;i<5;i++) dht11_dat[i]=read_dht11_dat(); DDRC|=_BV(DHT11_PIN); PORTC|=_BV(DHT11_PIN); byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3]; if(dht11_dat[4]!=dht11_check_sum) { Serial.println("DHT11 checksum error"); return false; } t= dht11_dat[2] + (double)dht11_dat[3]/100; h=dht11_dat[0] + (double)dht11_dat[1] /100; Serial.print("temperature = "); Serial.print(t,DEC); Serial.print("C"); Serial.print("Current humdity= "); Serial.print(String(h)); Serial.println("%"); return true; } byte read_dht11_dat() { byte i = 0; byte result = 0; for(i=0;i<8;i++) { while(!(PINC&_BV(DHT11_PIN))); delayMicroseconds(30); if(PINC&_BV(DHT11_PIN)) result|=(1<<(7-i)); while((PINC&_BV(DHT11_PIN))); } return result; } //================End DHT11 Code==================
下面使用的是dth11类库,类库需要安装IDE目录下的libraries, Uno与mega2560都可用使用

#include <avr/io.h> #include <avr/pgmspace.h> #include <SPI.h> #include <Ethernet.h> #include <IRremote.h> //#include <avr/wdt.h> #include <dht11.h> dht11 DHT11; #define DHT11PIN A5 double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } //摄氏温度度转化为华氏温度 double Kelvin(double celsius) { return celsius + 273.15; } //摄氏温度转化为开氏温度 // 露点(点在此温度时,空气饱和并产生露珠) // 参考: http://wahiduddin.net/calc/density_algorithms.htm double dewPoint(double celsius, double humidity) { double A0= 373.15/(273.15 + celsius); double SUM = -7.90298 * (A0-1); SUM += 5.02808 * log10(A0); SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; SUM += log10(1013.246); double VP = pow(10, SUM-3) * humidity; double T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558-T); } // 快速计算露点,速度是5倍dewPoint() // 参考: http://en.wikipedia.org/wiki/Dew_point double dewPointFast(double celsius, double humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(humidity/100); double Td = (b * temp) / (a - temp); return Td; } void setup() { Serial.begin(9600); Serial.println("DHT11 TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT11LIB_VERSION); Serial.println(); } void loop() { Serial.println("\n"); int chk = DHT11.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } Serial.print("Humidity (%): "); Serial.println((float)DHT11.humidity, 2); Serial.print("Temperature (oC): "); Serial.println((float)DHT11.temperature, 2); // Serial.print("Temperature (oF): "); // Serial.println(Fahrenheit(DHT11.temperature), 2); // // Serial.print("Temperature (K): "); // Serial.println(Kelvin(DHT11.temperature), 2); // // Serial.print("Dew Point (oC): "); // Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); // // Serial.print("Dew PointFast (oC): "); // Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); delay(2000); }
使用类库读出的温度居然比上面的高2度,见鬼了
--------折腾了半天原来读不出来是,数据连接线有问题,中间短路了
https://files.cnblogs.com/files/wdfrog/Dht11.rar
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2016-11-02 Cauchy 级数浓缩判别法