基于arduino的恒温控制(打印的室内温度计)

基于arduino的恒温控制(打印的室内温度计)(1)

天冷了,养热带花草和宠物的同学们需要多留意室内温度。下面给大家推荐一个实用性强、制作简单的温度计。使用 DS18B20 温度传感器和 OLED 模块构建,这里使用的开发板是 Piksey Pico,代码是兼容 Arduino 的,你也可以使用 Arduino 来完成它。制作步骤配有视频:

材料清单

基于arduino的恒温控制(打印的室内温度计)(2)

Arduino 或 Piksey Pico × 1DS18B20 温度传感器 × 10.96 英寸 OLED 模块 × 1电平转换器模块 × 1

编程和测试

1、将代码文件上传至 Arduino。

基于arduino的恒温控制(打印的室内温度计)(3)

2、显示器上的图形可以根据自己的具体情况来修改。

基于arduino的恒温控制(打印的室内温度计)(4)

3、将所有的组件安装到面包板上。接线方式如图所示。

基于arduino的恒温控制(打印的室内温度计)(5)

代码如下:

#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> #endif /* U8glib Example Overview: Frame Buffer Examples: clearBuffer/sendBuffer. Fast, but may not work with all Arduino boards because of RAM consumption Page Buffer Examples: firstPage/nextPage. Less RAM usage, should work with all Arduino boards. U8x8 Text Only Example: No RAM usage, direct communication with display controller. No graphics, 8x8 Text only. This is a page buffer example. */ // Please UNCOMMENT one of the contructor lines below // U8g2 Contructor List (Picture Loop Page Buffer) // The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp // Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display // End of constructor list #define SUN 0 #define SUN_CLOUD 1 #define CLOUD 2 #define RAIN 3 #define THUNDER 4 char i=0; /********************************************************************/ // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 2 /********************************************************************/ // Setup a oneWire instance to communicate with any OneWire devices // (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); /********************************************************************/ // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); /********************************************************************/ void drawWeatherSymbol(u8g2_uint_t x, u8g2_uint_t y, uint8_t symbol) { // fonts used: // u8g2_font_open_iconic_embedded_6x_t // u8g2_font_open_iconic_weather_6x_t // encoding values, see: https://github.com/olikraus/u8g2/wiki/fntgrpiconic 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"); // requires enableUTF8Print() } /* Draw a string with specified pixel offset. The offset can be negative. Limitation: The monochrome font with 8 pixel per glyph */ void drawScrollString(int16_t offset, const char *s) { static char buf[36]; // should for screen with up to 256 pixel width 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 visible dx = 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) { /* U8g2 Project: SSD1306 Test Board */ pinMode(10, OUTPUT); pinMode(9, OUTPUT); /* U8g2 Project: T6963 Test Board */ //pinMode(18, OUTPUT); //digitalWrite(18, 1); /* U8g2 Project: KS0108 Test Board */ //pinMode(16, OUTPUT); //digitalWrite(16, 0); /* U8g2 Project: LC7981 Test Board, connect RW to GND */ //pinMode(17, OUTPUT); //digitalWrite(17, 0); /* U8g2 Project: Pax Instruments Shield: Enable Backlight */ //pinMode(6, OUTPUT); //digitalWrite(6, 0); 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); }

或在项目文件库中下载。https://make.quwj.com/project/180

3D 打印外壳

基于arduino的恒温控制(打印的室内温度计)(6)

这个外壳最初只能容纳 OLED 模块。最后通过对 Piksey Pico 进行修改,我将所有组件都装进去了。如果你使用的是 Arduino Nano 或 UNO,那么外壳就只能容纳显示器,其他电子设备必须放在外面。

外壳的 3D 打印文件在项目文件库中下载:https://make.quwj.com/project/180

接线测试

基于arduino的恒温控制(打印的室内温度计)(7)

基于arduino的恒温控制(打印的室内温度计)(8)

布线方式可根据自己的习惯来。在项目中,我使用的是多股线,效果不错。最终的布线方式,会根据你的实际情况来,可能会与我的有些不同。

基于arduino的恒温控制(打印的室内温度计)(9)

基于arduino的恒温控制(打印的室内温度计)(10)

布线完毕后开始测试,确保一切正常后再进行组装。

组装所有的配件

基于arduino的恒温控制(打印的室内温度计)(11)

最后,当所有的配件安装完毕后,将外壳合上。注意安装时不要对 OLED 模块用力过猛,以免造成破损。

基于arduino的恒温控制(打印的室内温度计)(12)

基于arduino的恒温控制(打印的室内温度计)(13)

到目前为止,整个项目就完成了,非常的简单。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页