极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11547|回复: 4

光敏电阻亮度测量OLED12864以点形式屏幕显示效果

[复制链接]
发表于 2013-8-5 19:54:41 | 显示全部楼层 |阅读模式
本帖最后由 tom 于 2013-8-6 22:41 编辑

光敏电阻亮度测量以点的运动形态在OLED12864屏幕显示效果
/*
作者:tom
时间:2013年08月05日
IDE版本号:1.01
发表地址:www.geek-workshop.com
作用:

*/

实验器材:
Mango 控制器(Arduino UNO兼容控制器)
扩展板一块
双头母线若干
光敏电阻模块
Miscrodino OLED (I2C接口的12864显示器)

Arduino GND接OLED GND
Arduino 3.3V 接 OLED VCC
Arduino A4 接 OLED SDA
Arduino A5 接 OLED SCL

Arduino GND 接 光敏电阻模块的GND
Arduino VCC 接光敏电阻模块的 VCC
Arduino A0 接光敏电阻的检查接口 OUT

光敏电阻模块原理图

坐标系描绘
在屏幕的(10,60)为原点,水平线 Y=10
                          坚平线 X=60
使用用drawLine()画两条直线
  u8g.drawLine(0,60,128,60);//描绘坐标系X轴
  u8g.drawLine(10,0,10,64);//描绘坐标系Y轴
再画小箭头
水平线以(128,60)点,坚直线以(10,0)点画小箭头
  u8g.drawLine(10,0,7,4);//描绘小箭头
  u8g.drawLine(10,0,13,4);
  u8g.drawLine(128,60,124,63);//另一个小箭头
  u8g.drawLine(128,60,124,57);

为方便观察在屏幕中间位置画一条直线

u8g.drawLine(0,32,128,32);

继续加刻度线
  //在水平轴上加刻度线
  u8g.drawLine(20,60,20,58);//第一个刻度线
  u8g.drawLine(30,60,30,58);//第二个刻度线
  u8g.drawLine(40,60,40,58);//第三个刻度线
  u8g.drawLine(50,60,50,58);//第四个刻度线
  u8g.drawLine(60,60,60,58);//第五个刻度线
  u8g.drawLine(70,60,70,58);//第六个刻度线
  u8g.drawLine(80,60,80,58);//第七个刻度线
  u8g.drawLine(90,60,90,58);//第八个刻度线
  u8g.drawLine(100,60,100,58);//第九个刻度线
  u8g.drawLine(110,60,110,58);//第十个刻度线
  
  //坚直线刻度线
  u8g.drawLine(10,50,12,50);//第一个刻度线
  u8g.drawLine(10,40,12,40);//第二个刻度线
  u8g.drawLine(10,30,12,30);//第三个刻度线
  u8g.drawLine(10,20,12,20);//第四个刻度线
  u8g.drawLine(10,10,12,10);//第五个刻度线

还需要文字描述
  //写文字
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr(90,50,"time");
  u8g.drawStr(13,10,"lightness");

定义整型变量sensorValue读取模拟口A0的值,将sensorValuer 的值 映射成[64—0](屏幕的高度是64),传给整型变量outValue。

为了与人的习惯接轨,映射后,亮度高时输出值就高,高度低时输出值就低。

在串口打印出结果
  //在串口监视器上打印结果
  Serial.print("sensor = " );                       
  Serial.print(sensorValue);      
  Serial.print("  outValue: ");
  Serial.println(outValue);
Serial.println();

为避免刷新太快
每描绘一次,延时0.1秒,再进行再一次的描绘

Arduino 代码如下:
  1. #include "U8glib.h"

  2. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);        // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
  3. const int analogInPin = A0; //连接模拟口输入端口A0作为电压计

  4. int sensorValue = 0;        // (电压数据))模拟值
  5. int outValue; //将模拟值映射到所需要的范围内

  6. u8g_uint_t x;

  7. void draw_rect1(void)//绘制一个十字形,水平线居底,竖线靠左
  8. {
  9.   //将坐标的原点定在屏幕的中央,为了方便看见,Y轴定在X=10位置上
  10.   //坐标的原点为(10,60)
  11.   u8g.drawLine(0,60,128,60);//描绘坐标系X轴
  12.   u8g.drawLine(10,0,10,64);//描绘坐标系Y轴
  13.   //Y轴小箭头从(10,0)开始画线,X轴小箭头从(128,63)开始画线
  14.   u8g.drawLine(10,0,7,4);//描绘小箭头
  15.   u8g.drawLine(10,0,13,4);
  16.   u8g.drawLine(128,60,124,63);//另一个小箭头
  17.   u8g.drawLine(128,60,124,57);

  18.   //再加一条中间线
  19.   u8g.drawLine(0,32,128,32);

  20.   //在水平轴上加刻度线
  21.   u8g.drawLine(20,60,20,58);//第一个刻度线
  22.   u8g.drawLine(30,60,30,58);//第二个刻度线
  23.   u8g.drawLine(40,60,40,58);//第三个刻度线
  24.   u8g.drawLine(50,60,50,58);//第四个刻度线
  25.   u8g.drawLine(60,60,60,58);//第五个刻度线
  26.   u8g.drawLine(70,60,70,58);//第六个刻度线
  27.   u8g.drawLine(80,60,80,58);//第七个刻度线
  28.   u8g.drawLine(90,60,90,58);//第八个刻度线
  29.   u8g.drawLine(100,60,100,58);//第九个刻度线
  30.   u8g.drawLine(110,60,110,58);//第十个刻度线

  31.   //坚直线刻度线
  32.   u8g.drawLine(10,50,12,50);//第一个刻度线
  33.   u8g.drawLine(10,40,12,40);//第二个刻度线
  34.   u8g.drawLine(10,30,12,30);//第三个刻度线
  35.   u8g.drawLine(10,20,12,20);//第四个刻度线
  36.   u8g.drawLine(10,10,12,10);//第五个刻度线

  37.   //写文字
  38.   u8g.setFont(u8g_font_unifont);
  39.   u8g.drawStr(90,50,"time");
  40.   u8g.drawStr(13,10,"lightness");
  41. }

  42. void mydraw( u8g_uint_t x)
  43. {
  44.   draw_rect1();

  45.   u8g_uint_t y;

  46.   y=outValue;
  47.   u8g.drawPixel(x+10,y);


  48. }  

  49. void setup() {
  50.   // 初始化串口通讯速率 9600 位每秒:
  51.   Serial.begin(9600);


  52. }

  53. void loop() {
  54.   u8g.firstPage();  
  55.   do {  
  56.     //读取模拟数值:
  57.     sensorValue = analogRead(analogInPin);   
  58.     outValue=map(sensorValue,0,1023,63,0);
  59.     //在串口监视器上打印结果
  60.     Serial.print("sensor = " );                       
  61.     Serial.print(sensorValue);      
  62.     Serial.print("  outValue: ");
  63.     Serial.println(outValue);
  64.     Serial.println();



  65.     mydraw(x);                 

  66.   }
  67.   while( u8g.nextPage() );

  68.   x=x+1;
  69.   if (x==128)
  70.   {
  71.     x=1;
  72.   }

  73.   //在下一次循环前等待300毫秒(原范例是2毫秒)
  74.   delay(100);                     
  75. }

复制代码


程序运行效果。
白天时的测试结果
将手放在光敏电阻的上方,用手的阴影挡住它,亮点在接近X轴的附近跳动。
S01.jpg


S02.jpg



开灯之后,s03.jpg


开灯时,亮点在屏幕的上半部份跳动。屏幕图片s04.jpg

s01.jpg
s02.jpg
s03.jpg
s04.jpg
回复

使用道具 举报

发表于 2013-9-5 18:09:07 | 显示全部楼层
请问楼主,怎样能让它以线的形式显示,,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-5 19:38:40 | 显示全部楼层
颜羽悠 发表于 2013-9-5 18:09
请问楼主,怎样能让它以线的形式显示,,,,

当时我试了好几次,都没有解决。抱歉。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-24 16:19 , Processed in 0.051579 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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