GPS OLED DHT11 Arduino

 /**********************Arduino*************************/

// 基于Arduino平台,GPS定位,DHT11显示温湿度,通过OLED屏显示以上信息

//GPS通过串口与Arduino相连,读取其相关数据并解析,误差一两米,正常连接7~8颗星

//DHT11温湿度模块,精度为1,读取一次温湿度用时约40*40us

 /***********************************************************/

#include <Wire.h>

#include <dht11.h>
 #include <string.h>
 #include <ctype.h>
 #include "nAsc.h"
 int byteGPS=-1;
 char linea[150] = "";
 char comandoGPR[7] = "$GPRMC";//定位信息
 char GPGGA[7] = "$GPGGA";//定位信息
 int cont=0;
 int GGA=0;
 int RMC=0;
 char X;
 int conta=0;
 int indices[13];
char Lo[10],La[10],St;
dht11 DHT11;


int UG2864Address = 0x3C;//OLED UG2864??
int RES = 45;//Gadgeteer PIN6
int DC = 44;//Gadgeteer PIN3
void Writec(unsigned char COM)
{
Wire.beginTransmission(UG2864Address);
Wire.write(0x00);
Wire.write(COM);
Wire.endTransmission();
}
//д???
void Writed(unsigned char DATA)
{
Wire.beginTransmission(UG2864Address);
Wire.write(0x40);
Wire.write(DATA);
Wire.endTransmission();
}
//OLED UG2864?????
void SSD1306()
{
Writec(0XAE);//display off
Writec(0X00);//set lower column address
Writec(0X10);//set higher column address
Writec(0X40);//set display start line
Writec(0XB0);//set page address
Writec(0X81);//set contract control
Writec(0XCF);// VCC Generated by Internal DC/DC Circuit
Writec(0XA1);//set segment remap  column address 127 is mapped to SEG0
Writec(0XA6);//normal / reverse   normal display
Writec(0XA8);//multiplex ratio
Writec(0X3F);//1/64
Writec(0XC8);//Com scan direction remapped mode. Scan from COM[N-1] to COM0
Writec(0XD3);//set display offset
Writec(0X00);
Writec(0XD5);//set osc division
Writec(0X80);
Writec(0XD9);//set pre-charge period
Writec(0X11);
Writec(0XDa);//set COM pins
Writec(0X12);
Writec(0X8d);/*set charge pump enable*/
Writec(0X14);
Writec(0Xdb);//Set VcomH
Writec(0X20);
Writec(0XAF);//display ON
}
void fill(unsigned char dat)
{
unsigned char i,j;

Writec(0x00);//set lower column address
Writec(0x10);//set higher column address
Writec(0xB0);//set page address
for(j=0;j<8;j++)
{
Writec(0xB0+j);//set page address
Writec(0x00);//set lower column address
Writec(0x10);//set higher column address
for(i=0;i<128;i++)
Writed(dat);
}
}
void nAscii8x16s(unsigned char page,unsigned char line,char *ascii)
{
  unsigned char i=0;
  while(ascii[i])
  {
    nAscii8x16(page,line+i*8,ascii[i++]);
  }
}


void nAscii8x16(unsigned char page,unsigned char line,unsigned char ascii)
{
  unsigned char i;
  unsigned int zm;
         zm =  (ascii-0x20)*16;
         Writec(0xB0+page);//set page address    
    Writec(0x00+ line%16);//set lower column address
Writec(0x10+ line/16);//set higher column address   
         for(i=0;i<8;i++)
             Writed(nAsciiDot8x16[zm++]);
       
         Writec(0xB0+page+1);//set page address    
    Writec(0x00+ line%16);//set lower column address
Writec(0x10+ line/16);//set higher column address   
         for(i=0;i<8;i++)
             Writed(nAsciiDot8x16[zm++]);             
}
 void setup()
 {
    pinMode(RES,OUTPUT);//RES
pinMode(DC,OUTPUT);//D/C#
Serial.begin(115200); 
        Serial2.begin(4800); 
//SAO=0
digitalWrite(DC,LOW);
Wire.begin();    
       SSD1306();
       fill(0);
 }
 void GPS() {
      while((byteGPS!=13)) 
       { if(Serial2.available() > 0)    
       {  byteGPS=Serial2.read();               
             linea[conta]=byteGPS;       
             conta++;}   
       } 
   linea[conta]='\0';
  byteGPS=-1;       
 //  Serial.print(linea); 
              cont=0;
               RMC=0; GGA=0;
              //Serial.println("Start"); 
               for (int i=1;i<7;i++) // 判断 $GPRMC 符号 
                    {  if (linea[i]==comandoGPR[i-1])
                            { RMC++;
                            }  
                    }
             for (int i=1;i<7;i++) // 判断 $GPRMC 符号 
                    {  if (linea[i]==GPGGA[i-1])
                            { GGA++;
                            //  Serial.print(bien);   
                            }  
                    }
                if(GGA==6)   //读取 $GPRMC后面的数据
                   {  // Serial.println("GGAGGAGGAGGA\t");
                      for (int i=0;i<150;i++)
                             {    if (linea[i]==',') 
                                          {     indices[cont]=i; 
                                                cont++;
                                          }       
                              }                         
                       X =linea[(indices[6]+2)];   
                   }                 
               if(RMC==6)   //读取 $GPRMC后面的数据
                   {  // Serial.println("66666666666\t");
                      for (int i=0;i<150;i++)
                             {    if (linea[i]==',') 
                                          {     indices[cont]=i; 
                                                cont++;
                                          }       
                              }                         
                        St =linea[(indices[1]+1)];
                        for(int i=0, j=indices[2];j<(indices[2]+ 9);j++,i++)
                                La[i] =linea[j+1];
                       for(int i=0,  j=indices[4];j<(indices[4]+10);j++,i++)             
                               Lo[i] =linea[j+1];   
                   }              
                   conta=0;   // Reset the buffer
             for (int i=0;i<150;i++)
                 linea[i]=' ';                             
    } 
void loop()
 {   GPS();
      int  chk = DHT11.read(29);
         nAscii8x16s(0,0,"Hum:");
       char DHT_h=DHT11.humidity;
       char DHT_t=DHT11.temperature;
          nAscii8x16(0,50,DHT_h/10+48);
          nAscii8x16(0,60,DHT_h%10+48);
     GPS();
          nAscii8x16s(2,0,"Tem:");
          nAscii8x16(2,50,DHT_t/10+48);
          nAscii8x16(2,60,DHT_t%10+48);
     GPS();     
           nAscii8x16(0,90,X);
           nAscii8x16(2,90,St); 
     GPS();   
      
        double     La2,Lo2; 
        int       La1,Lo1;//整数部分


       double  c1=atof(La);  
               La1=c1/100;  //整数部分
               La2=(c1-La1*100)/60;
      char LA[10];
            sprintf(LA,"%f",La1+La2);
            nAscii8x16s(4,0,"L a:");     
            nAscii8x16s(4,40,LA);
           
     double  c2=atof(Lo);     
             Lo1=c2/100;  //整数部分
             Lo2=(c2-Lo1*100)/60;
     char     LO[10];
             sprintf(LO,"%f",Lo1+Lo2);    
             nAscii8x16s(6,0,"L o:"); 
             nAscii8x16s(6,40,LO);
          DHT_h=DHT11.humidity;
          DHT_t=DHT11.temperature;      
  //   char buff[24];  
  //   if(St=='V')
       //   sprintf(buff, "%2d %2d",DHT_h, DHT_t);
  //  if(St=='A')
  // ?addr=   &H=DHT_h&HHT=HDHT_t&     
   //   sprintf(buff, "%2d %2d %9s %10s",DHT_h, DHT_t, La, Lo);
   //    Serial.println(buff);
      Serial.print("http://192.168.0.188/ioss?addr= aa" );
      char DHT_H[5],DHT_T[5];
      sprintf(DHT_H,"%d",DHT_h);            sprintf(DHT_T,"%d",DHT_t);
      Serial.print("&humidity= ");          Serial.print(DHT_H);
      Serial.print(" &temperature= ");      Serial.print(DHT_T);
      Serial.print(" &validity= ");          Serial.print(St);
      Serial.print(" &Latitude= " );        Serial.print(La);
       Serial.print(" &Longitude=  " );      Serial.print(Lo);
       Serial.write('/n/r');                Serial.println("");

 }






注:湿度32,温度28,经度45+(43.1038)/60度,维度 126+(38.8194)度 正确性:A(有效)、V(无效),连接星数:7颗

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值