自己编的Arduino+NRF24L01将DHT11温度值发送程序,请教屏幕显示闪烁是哪里问题?
/*nRF24L01 Arduino发送端
Ansifa
2015/3/7
引脚接法:
nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define LOGO16_GLCD_HEIGHT 16 //定义显示高度
#define LOGO16_GLCD_WIDTH16 //定义显示宽度
//中文:马(这就是存储点阵变量,str_1可以修改成自己喜欢的名称,用函数<span style="font-family: Arial, Helvetica, sans-serif;">display.drawBitmap()</span><span style="font-family: Arial, Helvetica, sans-serif;">调用就可以了)</span>
static const unsigned char PROGMEM str_1[] =
{
0x80,0x00,0x7F,0xE0,0x00,0x20,0x00,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1F,0xFC,
0x00,0x04,0x00,0x04,0x00,0x04,0xFF,0xE4,0x00,0x04,0x00,0x04,0x00,0x28,0x00,0x10
};
//中文:黎
static const unsigned char PROGMEM str_2[] =
{
0x06,0x40,0x38,0x7C,0x08,0x94,0x7E,0x24,0x1C,0x44,0x2A,0x94,0x49,0x08,0x02,0x80,
0x0C,0x60,0x31,0x18,0xC9,0x26,0x05,0x40,0x09,0x20,0x11,0x10,0x25,0x08,0x02,0x00
};
//中文:明
static const unsigned char PROGMEM str_3[] =
{
0x00,0x00,0x00,0xFC,0x7C,0x84,0x44,0x84,0x44,0x84,0x44,0xFC,0x7C,0x84,0x44,0x84,
0x44,0x84,0x44,0xFC,0x7C,0x84,0x44,0x84,0x01,0x04,0x01,0x04,0x02,0x14,0x04,0x08
};
//中文:工
static const unsigned char PROGMEM str_4[] =
{
0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00
};
//中文:作
static const unsigned char PROGMEM str_5[] =
{
0x09,0x00,0x09,0x00,0x09,0x00,0x11,0xFE,0x12,0x80,0x32,0x80,0x34,0x80,0x50,0xF8,
0x90,0x80,0x10,0x80,0x10,0x80,0x10,0xFC,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80
};
//中文:室
static const unsigned char PROGMEM str_6[] =
{
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
};
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//以下程序是DTH11温度湿度采集设置
int humi;//湿度
int tol;//校对码
int temp;//温度
int j;
unsigned int loopCnt;
int chr = {0};//创建数字数组,用来存放40个bit
unsigned long time;
#define pin 2
void setup()
{
Serial.begin(9600);
//---------初始化部分,不可随时修改---------
Mirf.cePin = 9; //设置CE引脚为D9
Mirf.csnPin = 10; //设置CE引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init();//初始化nRF24L01
//---------配置部分,可以随时修改---------
//设置接收标识符"Sen01"
Mirf.setRADDR((byte *)"Sen01");
//设置一次收发的字节数,这里发一个整数,写sizeof(unsigned int),实际等于2字节
Mirf.payload = sizeof(unsigned int);
//发送通道,可以填0~128,收发必须一致。
Mirf.channel = 3;
Mirf.config();
//注意一个Arduino写Sender.ino,另一个写Receiver.ino。
//这里标识写入了Sender.ino
Serial.println("I'm Sender...");
}
unsigned int adata = 0;
void loop()
{
{
bgn:
delay(2000);
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)
{}
time = micros();
while(digitalRead(pin) == HIGH)
{}
//当出现低电平,记下时间,再减去刚才储存的time
//得出的值若大于50μs,则为‘1’,否则为‘0’
//并储存到数组里去
if (micros() - time >50)
{
chr=1;
}else{
chr=0;
}
}
//湿度,8位的bit,转换为数值
humi=chr*128+chr*64+chr*32+chr*16+chr*8+chr*4+chr*2+chr;
//温度,8位的bit,转换为数值
temp=chr*128+chr*64+chr*32+chr*16+chr*8+chr*4+chr*2+chr;
//校对码,8位的bit,转换为数值
tol=chr*128+chr*64+chr*32+chr*16+chr*8+chr*4+chr*2+chr;
//输出:温度、湿度、校对码
Serial.print("temperature:");
Serial.println(temp);
Serial.print(" humidity:");
Serial.print(humi);
Serial.println("%RH");
Serial.print("tol:");
Serial.println(tol);//校对码输出至串口
/*
lcd.init();
lcd.backlight();
lcd.print("temperature:");
lcd.print(temp);
lcd.print((char)223);
lcd.println("C"); //显示摄氏度符号
lcd.setCursor(0,1);//在LCD上换行
lcd.print("humidity:");
lcd.print(humi);
lcd.println("%RH");//空两行防止出现乱码,同时将湿度单位输出到LCD
*/
}
//读取A0值到adata
adata = temp;
//由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
//所以必须将所有需要传输的数据拆成byte。
//下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
//实际下面等于byte data;
byte data;
//adata是unsigned int双字节数据,必须拆开。
//将adata高低八位拆分:
data = adata & 0xFF; //低八位给data,
data = adata >> 8; //高八位给data。
//设置向"serv1"发送数据
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
//while死循环等待发送完毕,才能进行下一步操作。
while(Mirf.isSending()) {}
delay(20);
//以下是oled显示部分
// 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)
// init done
display.clearDisplay();
//英文字符显示
display.setTextSize(2); //设置字体大小
display.setTextColor(WHITE); //设置字体颜色白色
display.setCursor(0,0); //设置字体的起始位置
display.print("temp:"); //输出字符并换行
display.setTextColor(WHITE); //设置字体黑色,字体背景白色
display.println(temp); //输出数字并换行
display.print("humi:"); //输出字符并换行
display.println(humi); //输出数字并换行
//display.display(); //显示以上
//中文字符显示
display.drawBitmap(16, 32, str_1, 16, 16, 1); //在坐标X:16Y:16的位置显示中文字符凌
display.drawBitmap(32, 32, str_2, 16, 16, 1); //在坐标X:32Y:16的位置显示中文字符顺
display.drawBitmap(48, 32, str_3, 16, 16, 1);
display.drawBitmap(64, 32, str_4, 16, 16, 1);
display.drawBitmap(80, 32, str_5, 16, 16, 1);
display.drawBitmap(96, 32, str_6, 16, 16, 1);
display.display(); //把缓存的都显示
}
用的1306IIC口OLED屏幕作显示 请教大家,这个主程序有delay(2000)延时,显示的主程序怎么用中断来写,避免OLED屏幕显示闪烁 和我用的代码指令有点不一样,你可以试试更换一下。
display.clear();清屏
display.update(); 显示
还有就是这个:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// initialize with the I2C addr 0x3D (for the 128x64)
这个放在setup()里试试。 你好,这个程序卖吗? 楼主库文件哪里下载的 指个路;P
页:
[1]