mlm2002 发表于 2017-3-29 20:55:07

自己编的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();                  //把缓存的都显示
   

}

mlm2002 发表于 2017-3-29 20:58:06

用的1306IIC口OLED屏幕作显示

mlm2002 发表于 2017-3-30 21:57:17

请教大家,这个主程序有delay(2000)延时,显示的主程序怎么用中断来写,避免OLED屏幕显示闪烁

rockze 发表于 2017-4-2 14:41:38

和我用的代码指令有点不一样,你可以试试更换一下。

   display.clear();清屏
   display.update(); 显示

还有就是这个:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// initialize with the I2C addr 0x3D (for the 128x64)

这个放在setup()里试试。

ZYR 发表于 2020-2-13 11:37:33

你好,这个程序卖吗?

441920801 发表于 2020-2-16 11:57:11

楼主库文件哪里下载的   指个路;P
页: [1]
查看完整版本: 自己编的Arduino+NRF24L01将DHT11温度值发送程序,请教屏幕显示闪烁是哪里问题?