• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Miernik temperatury wilgotności i ciśnienia
#16
powinno pomóc na migotanie

Kod:
#include <DS1307RTC.h>
#include <Time.h>
#include <OneWire.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
Adafruit_BME280 bme; // I2C

const char *monthName[12] = {
"01", "02", "03", "04", "05", "06",
"07", "08", "09", "10", "11", "12"
};
byte temp[8] = //ikona temperatury
{
   B00100,
   B01010,
   B01010,
   B01110,
   B01110,
   B11111,
   B11111,
   B01110
};

byte wilg[8] = //ikona wilgotnosci
{
   B00100,
   B00100,
   B01010,
   B10001,
   B10001,
   B10001,
   B01110,
};

byte stopnie[8] = //ikona stopni
{
       B01100,
       B10010,
       B10010,
       B01100,
       B00000,
       B00000,
       B00000,
       B00000
};

byte procent[8] = //ikona stopni
{
       B11001,
       B11001,
       B00010,
       B00100,
       B00100,
       B01000,
       B10011,
       B10011
};

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

  unsigned long odczyt = 0;
  unsigned long czas = 0;
  unsigned long z = 0 ;
  byte lcdx = 1;
  byte strona = 1;
  
  float temperatura ;
  float wilgotnosc ;
  float cisnienie ;
  
void setup(void) {

  Serial.begin(9600);

  lcd.begin(20, 4);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.createChar(0, temp);
  lcd.createChar(1, wilg);
  lcd.createChar(3, stopnie);
  lcd.createChar(4, procent);

if (!bme.begin()) {while (1);}

}

void loop() {

  unsigned long sek = millis()/1000 ;
  if ( (millis()-czas) >= 5000 ){czas = millis();
  if (strona == 2){strona = 1;}
  else if(strona == 1){strona = 2;}}

if ( (millis()-odczyt) >= 2000 ){
  
temperatura = bme.readTemperature() ;
wilgotnosc = bme.readHumidity() ;
cisnienie = bme.readPressure()/100.0F ;
  
  odczyt = millis();}

if ( !ds.search(addr)){ds.reset_search();return;}
if (OneWire::crc8(addr, 7) != addr[7]){return;}

  switch (addr[0]) {
      case 0x10:
          type_s = 1;break;
      case 0x28:
          type_s = 0;break;
      case 0x22:
         type_s = 0;break;
      default:
   return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1);      

present = ds.reset();
ds.select(addr);    
ds.write(0xBE);        

for ( i = 0; i < 9; i++) {data[i] = ds.read();}

int16_t raw = (data[1] << 8) | data[0];

if (type_s) {raw = raw << 3;
if (data[7] == 0x10) {raw = (raw & 0xFFF0) + 12 - data[6];}}

else {byte cfg = (data[4] & 0x60);
      if (cfg == 0x00) raw = raw & ~7;
      else if (cfg == 0x20) raw = raw & ~3;}

celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;

switch (strona) {

case 1:

if (lcdx != 1){lcd.clear();lcdx = 1;} //czyszczenie ekranu 1

  lcd.setCursor (0, 2);
   lcd.write(byte(0));
   lcd.print("=");
   lcd.print(temperatura, 1);
   lcd.write(byte(3));
   lcd.print("C");

   lcd.setCursor (9, 2);
   lcd.print("P=");
   lcd.print(cisnienie, 1);
   lcd.print("hPa");

   lcd.setCursor (0, 3);
   lcd.write(byte(0));
   lcd.print("=");
   lcd.print(celsius, 1);
   lcd.write(byte(3));
   lcd.print("C");

   lcd.setCursor (9, 3);
   lcd.write(byte(1));
   lcd.write("=");
   lcd.print(wilgotnosc, 1);
   lcd.print("%");

  break;

case 2:

  if (lcdx != 2){lcd.clear();lcdx = 2;} //czyszczenie ekranu 2

tmElements_t tm;
if (RTC.read(tm)) {

   lcd.setCursor (6, 0);
   LCDprint2digits(tm.Hour);
   lcd.print(':');
   LCDprint2digits(tm.Minute);
   lcd.print(':');
   LCDprint2digits(tm.Second);
   lcd.setCursor (5, 1);
   lcd.print(tm.Day);
   lcd.print('/');
   lcd.print(monthName[tm.Month-1]);
   lcd.print('/');
   lcd.print(tmYearToCalendar(tm.Year));
        
   }

     else {if (RTC.chipPresent()) {lcd.println("DS1307 stoi. Uruchom Zegar");}
     else {lcd.println("DS1307 blad oczczytu!");
           lcd.println("sprawdz polaczenie");}}

  break;

}}

void LCDprint2digits(int number) {
if (number >= 0 && number < 10) {lcd.write('0');}
lcd.print(number);
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Miernik temperatury wilgotności i ciśnienia - przez JasQ - 29-09-2015, 16:48

Skocz do:


Przeglądający: 1 gości