Last active
April 29, 2019 14:21
-
-
Save tom-a/8f95230c25b903f54492387ffe499888 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <esp_wifi.h> | |
#include <Wire.h> | |
#include "Ambient.h" | |
WiFiClient client; | |
Ambient ambient; | |
const unsigned int PERIOD = 300; // 秒 | |
const unsigned int uS_TO_S_FACTOR = 1000000; | |
const unsigned int channelId = 00000; | |
const char* writeKey = "xxxxxxxxxxxxxxxx"; | |
const char* ssid = "SSID"; | |
const char* password = "passowrd"; | |
const byte BME280_ADDRESS = 0x76; | |
const byte GPIO_34 = 34; | |
const byte REG_CTRL_MEAS = 0xf4; | |
const byte REG_CTRL_HUM = 0xf2; | |
const byte REG_CONFIG = 0xf5; | |
unsigned long int hum_raw,temp_raw,pres_raw; | |
signed long int t_fine; | |
uint16_t dig_T1; | |
int16_t dig_T2, dig_T3; | |
uint16_t dig_P1; | |
int16_t dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9; | |
int8_t dig_H1; | |
int16_t dig_H2; | |
int8_t dig_H3; | |
int16_t dig_H4; | |
int16_t dig_H5; | |
int8_t dig_H6; | |
int read_reg(byte reg) | |
{ | |
byte val; | |
Wire.beginTransmission(BME280_ADDRESS); | |
Wire.write(reg); | |
Wire.endTransmission(false); | |
Wire.requestFrom(BME280_ADDRESS, 1, true); | |
while (Wire.available()) { | |
val = Wire.read(); | |
} | |
return val; | |
} | |
void write_reg(byte reg_address, byte data) | |
{ | |
Wire.beginTransmission(BME280_ADDRESS); | |
Wire.write(reg_address); | |
Wire.write(data); | |
Wire.endTransmission(); | |
} | |
unsigned long int calibration_H(signed long int adc_H) | |
{ | |
signed long int v_x1; | |
v_x1 = (t_fine - ((signed long int)76800)); | |
v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + | |
((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * | |
(((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * | |
((signed long int) dig_H2) + 8192) >> 14)); | |
v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4)); | |
v_x1 = (v_x1 < 0 ? 0 : v_x1); | |
v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); | |
return (unsigned long int)(v_x1 >> 12); | |
} | |
unsigned long int calibration_P(signed long int adc_P) | |
{ | |
signed long int var1, var2; | |
unsigned long int P; | |
var1 = (((signed long int)t_fine)>>1) - (signed long int)64000; | |
var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6); | |
var2 = var2 + ((var1*((signed long int)dig_P5))<<1); | |
var2 = (var2>>2)+(((signed long int)dig_P4)<<16); | |
var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18; | |
var1 = ((((32768+var1))*((signed long int)dig_P1))>>15); | |
if (var1 == 0) { | |
return 0; | |
} | |
P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125; | |
if(P<0x80000000) { | |
P = (P << 1) / ((unsigned long int) var1); | |
} else { | |
P = (P / (unsigned long int)var1) * 2; | |
} | |
var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12; | |
var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13; | |
P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4)); | |
return P; | |
} | |
signed long int calibration_T(signed long int adc_T) | |
{ | |
signed long int var1, var2, T; | |
var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11; | |
var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14; | |
t_fine = var1 + var2; | |
T = (t_fine * 5 + 128) >> 8; | |
return T; | |
} | |
void readData() | |
{ | |
int i = 0; | |
uint32_t data[8]; | |
Wire.beginTransmission(BME280_ADDRESS); | |
Wire.write(0xF7); | |
Wire.endTransmission(); | |
Wire.requestFrom(BME280_ADDRESS,8); | |
while(Wire.available()){ | |
data[i] = Wire.read(); | |
i++; | |
} | |
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); | |
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); | |
hum_raw = (data[6] << 8) | data[7]; | |
} | |
void readTrim() | |
{ | |
uint8_t data[32],i=0; // Fix 2014/04/06 | |
Wire.beginTransmission(BME280_ADDRESS); | |
Wire.write(0x88); | |
Wire.endTransmission(); | |
Wire.requestFrom(BME280_ADDRESS,24); // Fix 2014/04/06 | |
while(Wire.available()){ | |
data[i] = Wire.read(); | |
i++; | |
} | |
Wire.beginTransmission(BME280_ADDRESS); // Add 2014/04/06 | |
Wire.write(0xA1); // Add 2014/04/06 | |
Wire.endTransmission(); // Add 2014/04/06 | |
Wire.requestFrom(BME280_ADDRESS,1); // Add 2014/04/06 | |
data[i] = Wire.read(); // Add 2014/04/06 | |
i++; // Add 2014/04/06 | |
Wire.beginTransmission(BME280_ADDRESS); | |
Wire.write(0xE1); | |
Wire.endTransmission(); | |
Wire.requestFrom(BME280_ADDRESS,7); // Fix 2014/04/06 | |
while(Wire.available()){ | |
data[i] = Wire.read(); | |
i++; | |
} | |
dig_T1 = (data[1] << 8) | data[0]; | |
dig_T2 = (data[3] << 8) | data[2]; | |
dig_T3 = (data[5] << 8) | data[4]; | |
dig_P1 = (data[7] << 8) | data[6]; | |
dig_P2 = (data[9] << 8) | data[8]; | |
dig_P3 = (data[11]<< 8) | data[10]; | |
dig_P4 = (data[13]<< 8) | data[12]; | |
dig_P5 = (data[15]<< 8) | data[14]; | |
dig_P6 = (data[17]<< 8) | data[16]; | |
dig_P7 = (data[19]<< 8) | data[18]; | |
dig_P8 = (data[21]<< 8) | data[20]; | |
dig_P9 = (data[23]<< 8) | data[22]; | |
dig_H1 = data[24]; | |
dig_H2 = (data[26]<< 8) | data[25]; | |
dig_H3 = data[27]; | |
dig_H4 = (data[28]<< 4) | (0x0F & data[29]); | |
dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); // Fix 2014/04/06 | |
dig_H6 = data[31]; // Fix 2014/04/06 | |
} | |
void setup() { | |
uint8_t osrs_t = 2; //Temperature oversampling x 2 | |
uint8_t osrs_p = 2; //Pressure oversampling x 2 | |
uint8_t osrs_h = 2; //Humidity oversampling x 2 | |
uint8_t mode = 1; //Force mode | |
uint8_t t_sb = 5; //Tstandby 1000ms | |
uint8_t filter = 1; // | |
uint8_t spi3w_en = 0; //3-wire SPI Disable | |
uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; | |
uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; | |
uint8_t ctrl_hum_reg = osrs_h; | |
analogSetPinAttenuation(GPIO_34, ADC_11db); | |
Wire.begin(); | |
Serial.begin(115200); | |
write_reg(REG_CTRL_HUM, ctrl_hum_reg); | |
write_reg(REG_CTRL_MEAS, ctrl_meas_reg); | |
write_reg(REG_CONFIG, config_reg); | |
readTrim(); | |
double temp_act = 0.0, press_act = 0.0, hum_act=0.0; | |
signed long int temp_cal; | |
unsigned long int press_cal,hum_cal; | |
int sensorValue = analogRead(GPIO_34); | |
float voltage = sensorValue * (3.3 / 4095.0); | |
readData(); | |
temp_cal = calibration_T(temp_raw); | |
press_cal = calibration_P(pres_raw); | |
hum_cal = calibration_H(hum_raw); | |
temp_act = (double)temp_cal / 100.0; | |
press_act = (double)press_cal / 100.0; | |
hum_act = (double)hum_cal / 1024.0; | |
Serial.printf("電源電圧 : %7.2fV\n温度 : %7.2f度\n気圧 : %7.2fhPa\n湿度 : %7.2f%%\n\n", voltage, temp_act, press_act, hum_act); | |
WiFi.begin(ssid, password); | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
Serial.println(""); | |
Serial.println("WiFi connected."); | |
Serial.println("IP address: "); | |
Serial.println(WiFi.localIP()); | |
ambient.begin(channelId, writeKey, &client); | |
ambient.set(5, temp_act); | |
ambient.set(6, hum_act); | |
ambient.set(7, press_act); | |
ambient.set(8, voltage); | |
ambient.send(); | |
Serial.println("Setup ESP32 to sleep for every " + String(PERIOD) + " Seconds"); | |
Serial.println("Going to sleep now"); | |
esp_wifi_stop(); | |
esp_deep_sleep(PERIOD * uS_TO_S_FACTOR); | |
delay(1000); | |
} | |
void loop() { | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment