数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2191|回复: 3

[Arduino] 求助:8266 spi oled 显示温度湿度

[复制链接]
发表于 2021-4-28 15:51:49 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
现在能做到网页显示温度湿度(也是抄了别人的程序),可是oled我只会显示出文字温度湿度,没办法把测量出来的数值用oled显示出来,哪位高手帮忙看看呗,


#include <ESP8266WiFi.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI   D7
#define OLED_CLK   D5
#define OLED_DC    D1
#define OLED_CS    D8
#define OLED_RESET D3
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
const char* ssid = "RONBON";
const char* password = "longbang2015";
int temp = 0;//温度
int humi = 0;//湿度
unsigned int loopCnt;
int chr[40] = {0};
unsigned long timer;
#define pin D4

WiFiServer server(80);

static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };


/**
* 获取温湿度
*/
void get_humiture() {
  bgn:
  delay(2000);
  //设置2号接口模式为:输出
  //输出低电平20ms(>18ms)
  //输出高电平40μs
  pinMode(pin,OUTPUT);
  digitalWrite(pin,LOW);
  delay(20);
  digitalWrite(pin,HIGH);
  delayMicroseconds(40);
  digitalWrite(pin,LOW);
  //设置2号接口模式:输入
  pinMode(pin,INPUT);
  //高电平响应信号
  loopCnt=10000;
  while(digitalRead(pin) != HIGH)
  {
    if(loopCnt-- == 0)
    {
      //如果长时间不返回高电平,输出个提示,重头开始。
//      Serial.println("HIGH");
      goto bgn;
    }
  }
  //低电平响应信号
  loopCnt=30000;
  while(digitalRead(pin) != LOW)
  {
    if(loopCnt-- == 0)
    {
      //如果长时间不返回低电平,输出个提示,重头开始。
//      Serial.println("LOW");
      goto bgn;
    }
  }
    //开始读取bit1-40的数值  
    for(int i=0;i<40;i++)
  {
    while(digitalRead(pin) == LOW)
    {}
    //当出现高电平时,记下时间“timer”
    timer = micros();
    while(digitalRead(pin) == HIGH)
    {}
    //当出现低电平,记下时间,再减去刚才储存的timer
    //得出的值若大于50μs,则为‘1’,否则为‘0’
    //并储存到数组里去
    if (micros() - timer >50)
    {
      chr[i]=1;
    }else{
      chr[i]=0;
    }
  }

  //湿度,8位的bit,转换为数值
  humi=chr[0]*128+chr[1]*64+chr[2]*32+chr[3]*16+chr[4]*8+chr[5]*4+chr[6]*2+chr[7];

  //温度,8位的bit,转换为数值
  temp=chr[16]*128+chr[17]*64+chr[18]*32+chr[19]*16+chr[20]*8+chr[21]*4+chr[22]*2+chr[23];
}

void setup() {

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  pinMode(D4, OUTPUT);
  Serial.begin(115200);
  delay(10);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());


  //中文:温  (这就是存储点阵变量,str_1可以修改成自己喜欢的名称,用函数display.drawBitmap()调用就可以了)
static const unsigned char PROGMEM str_1[] =
{
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00
  };

//中文:度
static const unsigned char PROGMEM str_2[] =
{
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E
  };

//中文::
static const unsigned char PROGMEM str_3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00
  };

//中文:湿
static const unsigned char PROGMEM str_4[] =
{
0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00
  };

//中文:室
static const unsigned char PROGMEM str_5[] =
{
0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x3F,0xF8,0x04,0x00,0x08,0x20,
0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00
  };
//中文字符显示
display.clearDisplay();
  display.drawBitmap(0, 0, str_1, 16, 16, 1); //在坐标X:26  Y:16的位置显示中文字符凌
  display.drawBitmap(16, 0, str_2, 16, 16, 1); //在坐标X:42  Y:16的位置显示中文字符顺
  display.drawBitmap(32, 0, str_3, 16, 16, 1);

  //display.print(":");
display.print(humi);

  //display.int temp(48, 0, str_3, 16, 16, 1);
  display.drawBitmap(0, 16, str_4, 16, 16, 1);
  display.drawBitmap(16, 16, str_2, 16, 16, 1);
  display.drawBitmap(32, 16, str_3, 16, 16, 1);
  display.display();                  //把缓存的都显示


}

void loop() {
  //中文:温  (这就是存储点阵变量,str_1可以修改成自己喜欢的名称,用函数display.drawBitmap()调用就可以了)
static const unsigned char PROGMEM str_1[] =
{
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00
  };

//中文:度
static const unsigned char PROGMEM str_2[] =
{
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E
  };

//中文::
static const unsigned char PROGMEM str_3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00
  };

//中文:湿
static const unsigned char PROGMEM str_4[] =
{
0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00
  };

//中文:室
static const unsigned char PROGMEM str_5[] =
{
0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x3F,0xF8,0x04,0x00,0x08,0x20,
0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00
  };
//中文字符显示
display.clearDisplay();
  display.drawBitmap(0, 0, str_1, 16, 16, 1); //在坐标X:26  Y:16的位置显示中文字符凌
  display.drawBitmap(16, 0, str_2, 16, 16, 1); //在坐标X:42  Y:16的位置显示中文字符顺
  display.drawBitmap(32, 0, str_3, 16, 16, 1);

  //display.print(":");
display.print(humi);

  //display.int temp(48, 0, str_3, 16, 16, 1);
  display.drawBitmap(0, 16, str_4, 16, 16, 1);
  display.drawBitmap(16, 16, str_2, 16, 16, 1);
  display.drawBitmap(32, 16, str_3, 16, 16, 1);
  display.display();                  //把缓存的都显示

  // Check if a client has connected检查客户端是否已连接
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data等待客户端发送一些数据
  Serial.println("new client connected");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request阅读请求的第一行
  String req = client.readStringUntil('\r');
  Serial.println(req);

  client.flush();
  get_humiture();


  // Prepare the response
  String page = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n<head>";
  page += "<meta charset='utf-8'>";
//  page += "\r\n<link href='https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet'>";
  page += "\r\n<script src='https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js'></script>";
  page += "\r\n</head>\r\n<body style='padding:10px'>";
  page += "\r\n<h1>实时温湿度:</h1><br>";

  // 日期
  page += "\r\n<div id='date'></div><br>";

  String humistring = "温度: ";
  humistring += temp;
  humistring += " 湿度:";
  humistring += humi;

  // 温湿度
  page += "\r\n<div id='content'>";
  page += humistring;
  page += "</div><br>";

  page += "\r\n<script>\r\n";
  page += "var date = new Date(); $('#date').text(date);";
  page += "\r\n";
  page += "setInterval(function(){$.post('/gethumi', {}, function(res) {var date = new Date(); $('#date').text(date); $('#content').html(res);})}, 3000);";
  page += "\r\n";
  page += "console.log('" + humistring + "')";
  page += "\r\n</script>";
  page += "\r\n</body>\r\n</html>\n";


  // Match the request
  if (req.indexOf("/index.html") != -1) {
    client.print(page);
    return;
  } else if (req.indexOf("/gethumi") != -1) {
    String humires = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n<head>";
    humires += "<meta charset='utf-8'></head><body>";
    humires += humistring;
    humires += "</body></html>";
    client.print(humires);
  } else {
    Serial.println("invalid request");
    client.stop();
    return;
  }
  delay(1);
//display.display();
//display.clearDisplay();
//display.setTextSize(2);
//display.setCursor(0,0);   
//display.println("int temp");
//display.display();


  display.clearDisplay();
  display.drawBitmap(0, 0, str_1, 16, 16, 1); //在坐标X:26  Y:16的位置显示中文字符凌
  display.drawBitmap(16, 0, str_2, 16, 16, 1); //在坐标X:42  Y:16的位置显示中文字符顺
  display.drawBitmap(32, 0, str_3, 16, 16, 1);
  display.drawBitmap(48, 0, humi, 16, 16, 1);
  //display.print(":");
//display.print(humi);

  //display.int temp(48, 0, str_3, 16, 16, 1);
  display.drawBitmap(0, 16, str_4, 16, 16, 1);
  display.drawBitmap(16, 16, str_2, 16, 16, 1);
  display.drawBitmap(32, 16, str_3, 16, 16, 1);
  display.display();                  //把缓存的都显示
}

 楼主| 发表于 2021-4-28 20:38:55 来自手机浏览器 | 显示全部楼层
小白一个,各种度娘搜索代码往里加,也不管好使不好使,现在是显示归显示,测量归测量,没办法把他们两个弄到一起,里面代码也很乱,反正就是各种试,
回复 支持 反对

使用道具 举报

发表于 2021-4-28 22:48:54 | 显示全部楼层
建议还是好好学习下基础吧,大概了解下也行,C语言和C++,把静态变量写到 loop()里也是没谁了:sweat:
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-29 08:32:51 来自手机浏览器 | 显示全部楼层
40560335 发表于 2021-4-28 22:48
建议还是好好学习下基础吧,大概了解下也行,C语言和C++,把静态变量写到 loop()里也是没谁了 ...

上学时候学的C都忘光了,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-11-11 14:10 , Processed in 0.234001 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表