/**********************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颗