#include <Wire.h>
//===============================================
#include <SoftwareSerial.h>
#include <string.h>
#include <TinyGPS.h>
//================================================
#define u16 unsigned int
#define u8 unsigned char
#define u32 unsigned long
#define u64 unsigned long long
#define MS5611 0x77
#define Reset 0x1e
#define Temperature 0x50
#define Pressure 0x40
#define CONV 0x40
#define READ 0x00
#define OSR 0x08
#define D1 0x00
#define D2 0x10
#define PROM_RD 0xa0
u8 i;
uint32_t d1;
uint32_t d2;
int32_t TEMP = 0;
u16 Prom[8];
float P,T,dT,OFF,SENS;
float Tem;
float Pre;
const float sea_press = 1013.25;
//===============================================
SoftwareSerial GPS(8, 9); //4RX,5TX
TinyGPS gps;
unsigned long fix_age;
long lat, lon;
float LAT, LON;
void gpsdump(TinyGPS &gps);
//bool feedgps();
//void getGPS(); // gps初始化结束
//============================================
void initial(u8 address)
{
// Serial.println();
// Serial.println("PROM COEFFICIENTS ivan");
Wire.beginTransmission(address);
Wire.write(0x1E); // reset
Wire.endTransmission();
delay(10);
for (int i=0; i<6 ; i++)
{
Wire.beginTransmission(address);
Wire.write(0xA2 + (i * 2));
Wire.endTransmission();
Wire.beginTransmission(address);
Wire.requestFrom(address, (u8) 6);
delay(1);
if(Wire.available())
{
Prom[i+1] = Wire.read() << 8 | Wire.read(); }
else
{
Serial.println("Error reading PROM 1"); }
}
Serial.println(Prom[i+1]);
Serial.println();
//===================================================
// GPS.begin(9600); // GPS module baud rate
// Serial.begin(9600); // the Serial port of Arduino baud rate.
//delay(500);
//========================================================
}
long getVal(int address, byte code)
{
unsigned long ret = 0;
Wire.beginTransmission(address);
Wire.write(code);
Wire.endTransmission();
delay(10); // start read sequence
Wire.beginTransmission(address);
Wire.write((byte) 0x00);
Wire.endTransmission();
Wire.beginTransmission(address);
Wire.requestFrom(address, (int)3);
if (Wire.available() >= 3)
{ ret = Wire.read() * (unsigned long)65536 + Wire.read() * (unsigned long)256 + Wire.read(); }
else { ret = -1; }
Wire.endTransmission();
return ret;
}
int lightsensorvolue;
byte dht_dpin=7;
byte dht_dat[5];
void setup(){{
Serial.begin(9600);//通信
delay(300);
GPS.begin(9600);
Serial.begin(9600);
delay(500);
}
Wire.begin();
initial(MS5611);
delay(5);
InitDHT();//温度定义开始
//Serial.println("HELLO READY GO\n\n");
delay(1000);//温度定义结束
}
void loop()
{
{
{
int32_t T1 = 0;
int64_t OFF1 = 0;
int64_t SENS1 = 0;
d1 = getVal(MS5611,0x48);//temp
d2 = getVal(MS5611,0x58);//pressure
dT = d2 - ((int32_t)Prom[5] << 8);
OFF = ((int64_t)Prom[2]*pow(2,17) + dT*Prom[4]/pow(2,6));
SENS = ((int64_t)Prom[1]*pow(2,16) + dT*Prom[3]/pow(2,7));
T = 2000+((float)(dT*Prom[6]))/pow(2,23);
if(T< 2000) // if temperature lower than 20 Celsius
{
T1 = pow(dT, 2) / 2147483648;
OFF1 = 5 * pow((T - 2000), 2) / 2;
SENS1 = 5 * pow((T - 2000), 2) / 4;
if(TEMP < -1500) // if temperature lower than -15 Celsius
{
OFF1 = OFF1 + 7 * pow((T + 1500), 2);
SENS1 = SENS1 + 11 * pow((T + 1500), 2) / 2;
}
}
T -= T1;
OFF -= OFF1;
SENS -= SENS1;
Tem = (float)T/ 100;
Pre =((((float)(d1*SENS))/pow(2,21) - OFF)/pow(2,15))/100;
Serial.print("1.Actual TEMP= ");
Serial.print(Tem);
Serial.print(" Actual PRESSURE= ");
Serial.println(Pre);
delay(1000);//大气压结束
}
StartDHT22();//温湿开始
for (byte i=0;i<5;i++)
dht_dat[i] = readByte();
byte checksum=dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
if(dht_dat[4] == checksum){
int HighByte = dht_dat[0];
int LowByte = dht_dat[1];
int TReading = (HighByte << 8) + LowByte;
int Whole = TReading / 10;
int Fract = TReading % 10;
Serial.print("3.humidity=");
Serial.print(Whole);
Serial.print(".");
Serial.print(Fract);
Serial.print("%");
HighByte = dht_dat[2];
LowByte = dht_dat[3];
TReading = (HighByte<<8)+LowByte;
Whole=TReading/10;
Fract=TReading%10;
Serial.print(" temperature =");
int SignBit = TReading & 0x8000;
if(SignBit)
Serial.print("-");
Serial.print(Whole);
Serial.print(".");
Serial.print(Fract);
Serial.println("C");
}
delay(1000);
myGPS();
delay(2000);
}
lightsensorvolue=analogRead(A3);
if (analogRead(A3)>400){
Serial.print("2.OPEN:");
Serial.println( analogRead(A3));
}
if(analogRead(A3)<400){
Serial.print( "2.CLOSE:");
Serial.println(analogRead(A3));
}
delay(2000);//延时2S,
}
void InitDHT()
{
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
}
void StartDHT22(){
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,LOW);
delay(1);
digitalWrite(dht_dpin,HIGH);
delayMicroseconds(40);
pinMode(dht_dpin,INPUT);
while(digitalRead(dht_dpin)==LOW);
while(digitalRead(dht_dpin)==HIGH);
}
byte readByte(){
byte result=0;
for(byte i=0;i<8;i++){
while(digitalRead(dht_dpin)==LOW);
delayMicroseconds(45);
if(digitalRead(dht_dpin)==HIGH)
result |= ( 1 <<(7-i));
while (digitalRead(dht_dpin)==HIGH);
}
return result;//温湿度结束
delay(2000);
}
//=====================================================
void myGPS()
{
// GPS.begin(9600);
//delay(30);
int counter=0;
//GPS.listen();
//for (;;)
//{
long lat, lon;
//unsigned long fix_age, time, date, speed, course;
//unsigned long chars;
// unsigned short sentences, failed_checksum;
long Latitude, Longitude;
gps.get_position(&lat, &lon,&fix_age);
getGPS();
Serial.print("4.Latitude : ");
Serial.print(LAT/1000000,7);
Serial.print(" :: Longitude : ");
Serial.println(LON/1000000,7);
/* if (LAT == 0 && LON == 0)
{
continue;
}
counter ;
if (counter<30)
{
continue;
}
break;
} */
}
void getGPS()
{
bool newdata = false;
unsigned long start = millis();
while (millis() - start < 2000)
{
if (feedgps ())
{
newdata = true;
}
}
if (newdata)
{
gpsdump(gps);
}
}
bool feedgps()
{
while (GPS.available())
{
if (gps.encode(GPS.read()))
return true;
}return 0;
}
void gpsdump(TinyGPS &gps)
{
gps.get_position(&lat, &lon);
LAT = lat;
LON = lon;
{
feedgps();
}
delay(3000);
}
|