光敏电阻亮度测量OLED12864以点形式屏幕显示效果
本帖最后由 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),传给整型变量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 areSCK = 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
请问楼主,怎样能让它以线的形式显示,,,, 颜羽悠 发表于 2013-9-5 18:09 static/image/common/back.gif
请问楼主,怎样能让它以线的形式显示,,,,
当时我试了好几次,都没有解决。抱歉。。。
页:
[1]