本帖最后由 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 代码如下:
- #include "U8glib.h"
- U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
- const int analogInPin = A0; //连接模拟口输入端口A0作为电压计
- int sensorValue = 0; // (电压数据))模拟值
- int outValue; //将模拟值映射到所需要的范围内
- u8g_uint_t x;
- void draw_rect1(void)//绘制一个十字形,水平线居底,竖线靠左
- {
- //将坐标的原点定在屏幕的中央,为了方便看见,Y轴定在X=10位置上
- //坐标的原点为(10,60)
- u8g.drawLine(0,60,128,60);//描绘坐标系X轴
- u8g.drawLine(10,0,10,64);//描绘坐标系Y轴
- //Y轴小箭头从(10,0)开始画线,X轴小箭头从(128,63)开始画线
- 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");
- }
- void mydraw( u8g_uint_t x)
- {
- draw_rect1();
- u8g_uint_t y;
- y=outValue;
- u8g.drawPixel(x+10,y);
- }
- void setup() {
- // 初始化串口通讯速率 9600 位每秒:
- Serial.begin(9600);
- }
- void loop() {
- u8g.firstPage();
- do {
- //读取模拟数值:
- sensorValue = analogRead(analogInPin);
- outValue=map(sensorValue,0,1023,63,0);
- //在串口监视器上打印结果
- Serial.print("sensor = " );
- Serial.print(sensorValue);
- Serial.print(" outValue: ");
- Serial.println(outValue);
- Serial.println();
- mydraw(x);
- }
- while( u8g.nextPage() );
- x=x+1;
- if (x==128)
- {
- x=1;
- }
- //在下一次循环前等待300毫秒(原范例是2毫秒)
- delay(100);
- }
复制代码
程序运行效果。
白天时的测试结果
将手放在光敏电阻的上方,用手的阴影挡住它,亮点在接近X轴的附近跳动。
S01.jpg
S02.jpg
开灯之后,s03.jpg
开灯时,亮点在屏幕的上半部份跳动。屏幕图片s04.jpg
|