arduino使用oled显示时间MQ_2温湿度

这代码一般都是复制过来,在小改下就行了

代码如下:

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;
}
static const unsigned char PROGMEM str_1[] =
{
0x00,0x08,0x43,0xFC,0x32,0x08,0x12,0x08,
      0x83,0xF8,0x62,0x08,0x22,0x08,0x0B,0xF8,
      0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,
      0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x20,0x00,
  };//温

static const unsigned char PROGMEM str_2[] =
{
0x01,0x00,0x00,0x84,0x3F,0xFE,0x22,0x20,
      0x22,0x28,0x3F,0xFC,0x22,0x20,0x23,0xE0,
      0x20,0x00,0x2F,0xF0,0x22,0x20,0x21,0x40,
      0x20,0x80,0x43,0x60,0x8C,0x1E,0x30,0x04,
  };  // 度

static const unsigned char PROGMEM str_3[] =
{
0x00,0x08,0x47,0xFC,0x34,0x08,0x14,0x08,
      0x87,0xF8,0x64,0x08,0x24,0x08,0x0F,0xF8,
      0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,
      0x23,0x30,0x21,0x24,0x3F,0xFE,0x20,0x00,
  }; //湿
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <dht11.h>
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>

dht11 DHT11;
#define DHT11PIN 2
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);  

#define LOGO16_GLCD_HEIGHT 16 //定义显示高度
#define LOGO16_GLCD_WIDTH  16 //定义显示宽度  

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void printDateTime(DateTime dateTime);
//创建实例
RTC_DS1307 RTC;

DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
char data[15];
char Str_year[3], Str_month[3], Str_date[3], Str_DoW[3], Str_hour[3], Str_minute[3], Str_second[3];
String recivedStr="";//接收到的字符串
int recivedNum =0;//接收到的字符个数
void setup()   {
  Serial.begin(9600);
  Wire.begin();
  // by default, we‘ll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)  //OLED 的I2C位置
  // init done  

  display.clearDisplay();
  ////////////////

 // Serial.println("Please enter the time: year[2]month[2]date[2]DoW[2]hour[2]minute[2]second[2]");
 // Serial.println("example: 2014-12-3 Wednesday 14:15:15 enter:14120303141515");//1703072154
  //英文字符显示
  //display.setTextSize(1);             //设置字体大小
  //display.setTextColor(WHITE);        //设置字体颜色白色
  //display.setCursor(0,0);             //设置字体的起始位置
  //display.println("   zhongbest.com");//输出字符并换行
  //display.display();                  //把缓存的都显示
  //初始化实时时钟
  RTC.begin();
}  

void loop() {
   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;
//  }
  display.clearDisplay();
  //英文字符显示
  display.setTextSize(1);             //设置字体大小
  display.setTextColor(WHITE);        //设置字体颜色白色
  display.setCursor(0,0);             //设置字体的起始位置  

 // display.print("Humidity(%):");
 // display.println((float)DHT11.humidity, 2);

 // display.print("Temperature(oC):");

//  display.print("Temperature(oF):");
//  display.println(Fahrenheit(DHT11.temperature), 2);
//
//  display.print("Temperature(K):");
//  display.println(Kelvin(DHT11.temperature), 2);
//
//  display.print("Dew Point(oC):");
//  display.println(dewPoint(DHT11.temperature, DHT11.humidity));
//
//  display.print("Dew PointFast(oC):");
//  display.println(dewPointFast(DHT11.temperature, DHT11.humidity));
  //中文字符显示
  display.drawBitmap(0, 5, str_1, 16, 16, 1); //在坐标X:26  Y:16的位置显示中文字符中
  display.drawBitmap(18, 5, str_2, 16, 16, 1); //在坐标X:42  Y:16的位置显示中文字符贝
  display.setCursor(36,11);             //设置字体的起始位置
  display.setTextSize(1);             //设置字体大小
  display.print(":");
  display.println((float)DHT11.temperature, 2);
   display.drawBitmap(0, 25, str_3, 16, 16, 1); //在坐标X:26  Y:16的位置显示中文字符中
  display.drawBitmap(18, 25, str_2, 16, 16, 1); //在坐标X:42  Y:16的位置显示中文字符贝
  display.setCursor(36,30);             //设置字体的起始位置
   display.setTextSize(1);             //设置字体大小
  display.print(":");
  display.println((float)DHT11.humidity, 2);
  int val;
  val=analogRead(0);
 // Serial.println(val,DEC);
  display.setCursor(0,55);             //设置字体的起始位置
  display.print("MQ-2: ");
  display.println(val,DEC);
 // display.setCursor(0,60);
  display.print("-------------------");
  DateTime now = RTC.now();
//通过串口传送当前的日期和时间
  printDateTime(now);

  ///////////////////////////////////////////////////////////

   while(Serial.available() > 0)//读取字符串
   {
      recivedStr += char(Serial.read());
//      delay(2);
      recivedNum = recivedNum+1;
   }
   if(recivedNum == 12)
   {  //year[2]month[2]date[2]DoW[2]hour[2]minute[2]second[2]
       String strtemp = "";
       strtemp = recivedStr.substring(0,2);
       int years = strtemp.toInt();
       RTC.set(RTC_YEAR,years);//设置年

       strtemp = recivedStr.substring(2,4);
       int months = strtemp.toInt();
       RTC.set(RTC_MONTH,months);//设置月

       strtemp = recivedStr.substring(4,6);
       int days = strtemp.toInt();
       RTC.set(RTC_DAY,days);//设置日

       strtemp = recivedStr.substring(6,8);
       int hours = strtemp.toInt();
       RTC.set(RTC_HOUR,hours);//设置小时

       strtemp = recivedStr.substring(8,10);
       int minutes = strtemp.toInt();
       RTC.set(RTC_MINUTE,minutes);//设置分钟

       strtemp = recivedStr.substring(10,12);
       int seconds = strtemp.toInt();
       RTC.set(RTC_SECOND,seconds);//设置秒
       recivedNum = 0;
   }
  display.display();                  //把缓存的都显示
  delay(1000);
} 

void printDateTime(DateTime dateTime) {
    //传送年份
     display.setCursor(0,45);             //设置字体的起始位置
    display.print(dateTime.year(), DEC);
    display.print(‘/‘);
    //传送月份
    display.print(dateTime.month(), DEC);
    display.print(‘/‘);
    //传送月份中的第几天
    display.print(dateTime.day(), DEC);
    display.print(‘ ‘);
    //传送小时
    display.print(dateTime.hour(), DEC);
    display.print(‘:‘);
    //传送分钟
    display.print(dateTime.minute(), DEC);
    display.print(‘:‘);
    //传送秒
    display.print(dateTime.second(), DEC);
    display.display();                  //把缓存的都显示
}

模块:

OLED12864显示屏:

模块针脚        Arduino针脚

VCC     ---->   3.3V

GND    ---->    GND

SCL     ---->    A5

SDA    ---->    A4

烟雾传感器MQ-2:

VCC     ---->    5V

GND    ---->    GND

A0       ---->    A0

温湿度传感器DHT11:

+       ------>   5V

OUT  ------>    2

-       ------>    GND

时钟模块DS1307:

SCL     ------->   A5

SDA    ------->   A4

VCC    ------->   5V

GND   ------->  GND

时间: 2024-10-27 09:44:23

arduino使用oled显示时间MQ_2温湿度的相关文章

PMS5003ST+Arduino Nano OLED屏显示

整合OLED显示和PMS5003报数 #include <Arduino.h> #include <pms.h> ////////////////////////////////// #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> ////////////////////////////////////

Arduino——My-Clock项目 发布时间:2018-12-31

技术:Arduino.光敏传感器.DHT11.DS1302.OLED显示屏 概述 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块用于获取时间,并用OLED显示屏进行实时显示. 详细 代码下载:http://www.demodashi.com/demo/14767.html 一.My-Clock简介 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块用于获取时间,并用OLED显示屏进行实时显

MicroPython之TPYBoard v102开发板控制OLED显示中文

转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 0x00前言 之前看到一篇文章是关于TPYBoardv102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文.最近利用空余时间搞定了这个实验,特此将实验过程及源码分享出来,方便以后使用. 0x01实验器材 TPYBoardv102开发板1块 0.96寸OLED显示屏(ssd1306)1块 杜邦线若干 0x02前期准备 1. 首先我们先来看一下,之前参考的OLED显示字符的文章. http://docs.tpyb

asp 之 让实体中字段类型为DateTime的字段只显示日期不显示时间

       在我们平时的工作开发中,我们通常会遇到这样的一个问题:某个实体的某个字段是DateTime类型的,可是我们在界面上只想让它显示日期不显示时间! 一个订单实体: //订单类 public class order { //订单ID public int id{get;set;} //物品ID public int resId{get;set;} //物品名称 public string resName { get; set; } //物品价格 public decimal price

php 中date显示时间不对与Linux文件乱码问题

php 中date显示时间不对解决办法如下1.修改/etc/php.ini文件 在里头中找到data.timezone =去掉它前面的分号';' 然后设置data.timezone = "Asia/Shanghai";即可 2.在程序代码中使用函数date_default_timezone_set('Asia/Shanghai'); 或者date_default_timezone_set('PRC'); 即可 LINUX 系统显示中文文件乱码 解决办法如下 1.永久解决 输入local

用JLabel显示时间-- JAVA初学者遇到的一个困难

问题:用一个JLabe,显示秒数,每过一秒数字自动减少1 问题看似很简单,但对初学JAVA的我来说,还真费了一点劲. 首先是如何即时,可以采用线程的方法: try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } timeLeft --; Thread.sleep( n ) 代表过n个毫秒之后再接着走下一步程序,也就是说n为1000时,在这停一秒再继续走接下去的步骤.相当于计时一秒. 那

history命令不显示时间

有时候系统的history命令不显示时间,但是我们想查看命令执行的时间是什么时候怎么办,下面的命令可以解决: export HISTTIMEFORMAT="%F %T" 不过这种是临时解决办法,如果想永久生效就把这段添加到/etc/profile里边,然后执行source /etc/profile使之生效

Android中通过反射来设置显示时间

这个Toast的显示在Android中的用途还是很大的,同时我们也知道toast显示的时间是不可控的,我们只能修改他的显示样式和显示的位置,虽然他提供了一个显示时间的设置方法,但是那是没有效果的(后面会说到),他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间其实是2.5s和3s.那么我们如果真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,而且Linux之父曾经说过:遇到问题就去看那个操蛋的源代码吧!!下面就从源代码开

FPGA学习之数码管(封装)显示时间

一.实验目的:学习数码管封装以及显示时间.二.实验环境:FPGA开发板AX301,Quartus ii三.实验介绍:将数码管显示模块封装起来,同时通过不断读取RTC时钟的时分秒值,将之显示在数码管.实验时,将实时时间的时分秒写入程序,运行程序后可以看到数码管显示的时间会不断的刷新.四.源码 module smg_interface_demo ( input CLK, input RSTn, output RST, output SCLK, inout SIO, output [7:0]SMG_D