Вы находитесь на странице: 1из 3

int SHT_clockPin = 3; // pin used for clock

int SHT_dataPin = 2; // pin used for data


#include <Wire.h>
#include <Adafruit_BMP085.h>
// Conectar pino Vcc do BMP085 ao pino 3.3v do Arduino (NAO UTILIZAR 5.0V !)
// Conectar pino GND do mdulo ao GND do Arduino
// Conectar o pino SCL do mdulo ao pino analgico 5 do Arduino
// Conectar o pino SDA do mdulo ao pino analgico 4 do Arduino
// Pino EOC (End of conversion) no utilizado
// Pino XCLR um pino de reset, tambm no utilizado
Adafruit_BMP085 bmp;

void setup() {
Serial.begin(9600);
Serial.println("");
Serial.println(" NoWiring - Environmental Monitoring | by Giorgio Picanco | gi
orgiopicanco@gmail.com | ");
Serial.println(" 'It has been said that something as small as the flutter of a b
utterfly's ");
Serial.println("wings can ultimately cause a typhoon halfway around the world' -
(Chaos Theory)");
Serial.println("");
delay(2000);
Serial.println(" Temp(SHT15 *C) | Temp(BMP085 *C) | Humidity (Relative) | Press(
Pa) | Alt(m) | RealAlt(m) | Tensao na bateria (mV):");
Serial.println("");
if (!bmp.begin()) {
Serial.println("Sensores no encontrados, verifique as conexes !");
while (1) {}
}
}

void loop() {
float temperature = getTemperature();
float humidity = getHumidity();
Serial.print(bmp.readTemperature());
Serial.print(" ");
Serial.print(temperature);
Serial.print(" ");
Serial.print(humidity);
Serial.print(" ");
Serial.print(bmp.readPressure());
Serial.print(" ");
Serial.print(bmp.readAltitude());
Serial.print(" ");
Serial.print(bmp.readAltitude(101500));
Serial.print(" ");
Serial.print(readVcc());
Serial.println();

}
long readVcc()
{
// Ler referncia interna 1.1V
// Ajusta a referncia ao Vcc e a medio de referncia interna para 1.1V
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_
ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_A
Ttiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_A
Ttiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(2); // Aguarde
ADCSRA |= _BV(ADSC); // Inicia a converso
while (bit_is_set(ADCSRA,ADSC)); // Medindo
uint8_t low = ADCL; // Vai ler ADCL primeiro - Ento trava ADCH
uint8_t high = ADCH; // Desbloqueia
long result = (high<<8) | low;
result = 1125300L / result; // Calcular Vcc em milivolts; 1125300 = 1.1*1023*100
0
return result; // Vcc em milivolts
}
float getTemperature(){
//Return Temperature in Celsius
SHT_sendCommand(B00000011, SHT_dataPin, SHT_clockPin);
SHT_waitForResult(SHT_dataPin);
int val = SHT_getData(SHT_dataPin, SHT_clockPin);
SHT_skipCrc(SHT_dataPin, SHT_clockPin);
return (float)val * 0.01 - 40; //convert to celsius
}
float getHumidity(){
//Return Relative Humidity
SHT_sendCommand(B00000101, SHT_dataPin, SHT_clockPin);
SHT_waitForResult(SHT_dataPin);
int val = SHT_getData(SHT_dataPin, SHT_clockPin);
SHT_skipCrc(SHT_dataPin, SHT_clockPin);
return -4.0 + 0.0405 * val + -0.0000028 * val * val;
}
void SHT_sendCommand(int command, int dataPin, int clockPin){
// send a command to the SHTx sensor
// transmission start
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, LOW);
// shift out the command (the 3 MSB are address and must be 000, the last 5 bi
ts are the command)
shiftOut(dataPin, clockPin, MSBFIRST, command);
// verify we get the right ACK
digitalWrite(clockPin, HIGH);
pinMode(dataPin, INPUT);
if (digitalRead(dataPin)) Serial.println("ACK error 0");
digitalWrite(clockPin, LOW);
if (!digitalRead(dataPin)) Serial.println("ACK error 1");
}
void SHT_waitForResult(int dataPin){
// wait for the SHTx answer
pinMode(dataPin, INPUT);
int ack; //acknowledgement
//need to wait up to 2 seconds for the value
for (int i = 0; i < 1000; ++i){
delay(2);
ack = digitalRead(dataPin);
if (ack == LOW) break;
}
if (ack == HIGH) Serial.println("ACK error 2");
}
int SHT_getData(int dataPin, int clockPin){
// get data from the SHTx sensor
// get the MSB (most significant bits)
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
byte MSB = shiftIn(dataPin, clockPin, MSBFIRST);
// send the required ACK
pinMode(dataPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
// get the LSB (less significant bits)
pinMode(dataPin, INPUT);
byte LSB = shiftIn(dataPin, clockPin, MSBFIRST);
return ((MSB << 8) | LSB); //combine bits
}
void SHT_skipCrc(int dataPin, int clockPin){
// skip CRC data from the SHTx sensor
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
delay(10);
}

Вам также может понравиться