摘要:最近各地都在下雪,湖南湖北西安都下雪了。养热带花草和宠物的同学们需要多留意室内温度。下面教一个实用性强、制作简单的温度计。使用DS18B20
温度传感器和OLED
模块构建,这里使用的开发板是Arduino。
本项目的源码和3D文件在后台回复:20211228,即可获取。
一、材料清单
Arduino × 1
DS18B20 温度传感器 × 1
0.96 英寸 OLED 模块 × 1
电平转换器模块 × 1
二、编程和测试
1、将代码文件上传至 Arduino。
2、显示器上的图形可以根据自己的具体情况来修改。
3、将所有的组件安装到面包板上。接线方式如图所示。
代码如下,代码很简单,就不过多介绍了。
#include <Arduino.h>
#include <U8g2lib.h>
#include <OneWire.h>
#include <DallasTemperature.h>#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endifU8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, SCL, SDA,U8X8_PIN_NONE); #define SUN 0
#define SUN_CLOUD 1
#define CLOUD 2
#define RAIN 3
#define THUNDER 4char i=0;
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);void drawWeatherSymbol(u8g2_uint_t x, u8g2_uint_t y, uint8_t symbol)
{ switch(symbol){case SUN:u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);u8g2.drawGlyph(x, y, 69); break;case SUN_CLOUD:u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);u8g2.drawGlyph(x, y, 65); break;case CLOUD:u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);u8g2.drawGlyph(x, y, 64); break;case RAIN:u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);u8g2.drawGlyph(x, y, 67); break;case THUNDER:u8g2.setFont(u8g2_font_open_iconic_embedded_6x_t);u8g2.drawGlyph(x, y, 67);break; }
}void drawWeather(uint8_t symbol, int degree)
{drawWeatherSymbol(0, 55, symbol);u8g2.setFont(u8g2_font_logisoso32_tf);u8g2.setCursor(48+3, 55);u8g2.print(degree);u8g2.print("°C");
}void drawScrollString(int16_t offset, const char *s)
{static char buf[36];size_t len;size_t char_offset = 0;u8g2_uint_t dx = 0;size_t visible = 0;len = strlen(s);if ( offset < 0 ){char_offset = (-offset)/8;dx = offset + char_offset*8;if ( char_offset >= u8g2.getDisplayWidth()/8 )return;visible = u8g2.getDisplayWidth()/8-char_offset+1;strncpy(buf, s, visible);buf[visible] = '\0';u8g2.setFont(u8g2_font_8x13_mf);u8g2.drawStr(char_offset*8-dx, 62, buf);}else{char_offset = offset / 8;if ( char_offset >= len )return; // nothing visibledx = offset - char_offset*8;visible = len - char_offset;if ( visible > u8g2.getDisplayWidth()/8+1 )visible = u8g2.getDisplayWidth()/8+1;strncpy(buf, s+char_offset, visible);buf[visible] = '\0';u8g2.setFont(u8g2_font_8x13_mf);u8g2.drawStr(-dx, 62, buf);}}void draw(const char *s, uint8_t symbol, int degree)
{int16_t offset = -(int16_t)u8g2.getDisplayWidth();int16_t len = strlen(s);for(;;){u8g2.firstPage();do {drawWeather(symbol, degree);// drawScrollString(offset, s);} while ( u8g2.nextPage() );delay(20);offset+=2;if ( offset > len*8+1 )break;}
}void setup(void) {pinMode(10, OUTPUT);pinMode(9, OUTPUT); u8g2.begin(); u8g2.enableUTF8Print();sensors.begin();
}void loop(void) {sensors.requestTemperatures();u8g2.firstPage();do {drawWeather(SUN_CLOUD, sensors.getTempCByIndex(0));} while ( u8g2.nextPage() );delay(1000);
}
三、3D打印外壳
这个外壳最初只能容纳 OLED 模块。最后通过对 Piksey Pico 进行修改,我将所有组件都装进去了。如果你使用的是 Arduino Nano 或 UNO,那么外壳就只能容纳显示器,其他电子设备必须放在外面。
四、接线测试
布线方式可根据自己的习惯来。在项目中,我使用的是多股线,效果不错。最终的布线方式,会根据你的实际情况来,可能会与我的有些不同。
布线完毕后开始测试,确保一切正常后再进行组装。
五、组装所有的配件
最后,当所有的配件安装完毕后,将外壳合上。注意安装时不要对 OLED 模块用力过猛,以免造成破损。
到目前为止,整个项目就完成了。这个项目非常的简单,适合初学的电子爱好者,如果你手头正好有一个不用的arduino板子和一个ds18b20就动手做一个吧!
社区:MAKE趣无穷
文章项目来源:https://make.quwj.com/project/180
点击查看往期内容
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~