• 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
#11
Dziękuję za pomoc
co do pomarańczowego koloru to w lini 83
lcd.createChar(4, procent);
mam "83: error: 'procent' was not declared in this scope
'procent' was not declared in this scope"
Biblioteki mogę oczywiście podesłać ale najbardziej zależy mi na zrozumieniu tego żeby móc sobie radzić samemu dlatego wszystkie uwagi mile widziane
 
Odpowiedź
#12
bo w kodzie nie miałeś znaczka procent sprawdź i daj znać do 22 jestem przed kompem , wziąłeś na barki dosyć skomplikowany program i sam nie do końca znam wszystkie używane w nim biblioteki i funkcje . Zacznij od podstaw bo wskoczyłeś na dość głęboką wodę .

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

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;
  
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 ){

if ( !ds.search(addr)){ds.reset_search();return;}


for( i = 0; i < 8; i++) { }   // Ta linia niewiem po co jest niczemu nie służy ?!


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;

odczyt = millis();}

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(bme.readTemperature(), 1);
   lcd.write(byte(3));
   lcd.print("C");

   lcd.setCursor (9, 2);
   lcd.print("P=");
   lcd.print(bme.readPressure() / 100.0F, 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(bme.readHumidity(), 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ź
#13
Dziękuję, kompilacja się powiodła Smile
Dam znać jak wgram program do Arduino.
Mam jeszcze jedno pytanie, gdybym chciał teraz dopisać do tego kod do sterowania driverem led przez PWM to gdzie to zacząć pisać? Jest kilka gotowców i na początek chciałem użyć gotowy kod tylko gdzie i jak go wkleić?
 
Odpowiedź
#14
musiałbyś podać co i jak ale poniżej tego kodu

Kod:
void loop() {

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


tutaj wklejasz
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#15
Dzisiaj zrobiłem test, zmiana ekranów działa, muszę jeszcze ogarnąć to opóźnienie odczytu z czujników, teraz mam dyskotekę po przecinku. Czy macie jakieś przykłady prostego sterownika Led przez pwm? Znalazłem kilka ale to wielkie kombajny a ja potrzebuję prosty sterownik, który włączy o określonej godzinie, przez zadany czas np 30min będzie liniowo zwiększał moc świecenia od 0 do max, świecił z max mocą do określonej godziny i następnie przez np 30 min będzie zmniejszał moc do zera.
 
Odpowiedź
#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ź
#17
Dziękuję, będę próbował. Teraz biorę się za PWM i ledy, coś mam złe przeczucia
 
Odpowiedź
#18
właśnie zrobiłem sterowanie tranzystorem IRF634A jak na poniższym obrazku działa be problemu na wyjściu PWM pin5 , zasiliłem tym żarówkę z 12v pobór około 5A trochę piszczał i się grzał ale działa bez problemu kwestia dobrania dobrego tranzystora ja użyłem pierwszy jaki mi się nawinął . zamiast led i r1 u mnie żarówka

[Obrazek: crappo.PNG]
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#19
Po wielu poszukiwaniach korzystając z wielu znalezionych gotowych rozwiązań przygotowałem coś takiego:
Kod:
#include <TimerOne.h>
#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 ;

//Start PWM
int ledEnable = 6;// assigns cooling fan ON/OFF control to digital pin 6.

/*
* IMPORTANT:  These *must* be the pins corresponding to the Timer1 timer on
* the ATmega168/328.  These are digital pins 9 and 10 on the Uno/Duemilanove.
*/
const int kChan0Pin = 9; // Channel 0 Pin
const int kChan1Pin = 10; // Channel 1 Pin

// All times are in seconds since midnight (valid 0 - 86399)
const long kTurnOn = 32400; // time dawn begins - 0900hrs
const long kTurnOff = 75600; // time sunset begins - 2100hrs

/*
* Light "state" represents the PWM duty cycle for each channel This normally
* dictates light intensity. It is an array { duty_chan_1, duty_chan_2 }.
* Possible values for duty cycle are 0 - 1023.
*/
const int kDayState[] = { 1023,1023 }; // daytime LED state
const int kNightState[] = { 0, 0 }; // nighttime LED state

// duration (in seconds) of sunrise/sunset fade
const long kFadeDuration = 3600; // 60 minutes

long ctr;

/*
* fader -- Determine output state for a given time to provide smooth fade from
* one state to another.
*     Args:
*     start_time  -- time (in seconds) of start of fade
*     start_state -- beginning state
*     end_state   -- ending state
*     out         -- array to update with state
*/
void fader(long start_time, const int start_state[], const int end_state[], int out[2]) {

 float per_second_delta_0 = (float) (end_state[0]-start_state[0])/kFadeDuration;
 float per_second_delta_1 = (float) (end_state[1]-start_state[1])/kFadeDuration;

 long elapsed = ctr-start_time;

 out[0] = start_state[0] + per_second_delta_0 * elapsed;
 out[1] = start_state[1] + per_second_delta_1 * elapsed;
}

// return seconds elapsed since midnight
long seconds_since_midnight() {
//  setTime(21, 45, 00, 16, 2, 2015);
//set the system time to 21hrs 45min 00sec 16,Feb 2015...does not set RTC, will reset upon powerup
 
 time_t t = now();
 long hr = hour(t);
 long min = minute(t);
 long sec = second(t);
 long total = hr * 3600 + min * 60 + sec;
 return total;
}

// set output state
void set_state(const int state[]) {
 if (state[0] >= 0 && state[0] <= 1023) Timer1.setPwmDuty(kChan0Pin, state[0]);
 if (state[1] >= 0 && state[1] <= 1023) Timer1.setPwmDuty(kChan1Pin, state[1]);
}

/*
* determine_state -- This is where the actual timing logic resides.  We
* examine ctr (seconds since midnight) and then set output state accordingly.
* Variable ctr rolls back to 0 at midnight so stages that cross midnight (ie:
* nighttime) are broken up into two stages.
*/
void determine_state() {
 if ( ctr >= 0 && ctr < kTurnOn ) { // night
     set_state(kNightState);
     
     lcd.setCursor(0,2);
     //lcd.print("                   ");
     lcd.setCursor(5,2);
     lcd.print("NIGHT/MODE ");        
     digitalWrite(ledEnable,LOW);
     lcd.setCursor(6,3);
     lcd.print("LED-OFF");
     
 } else if ( ctr >= kTurnOn && ctr <= (kTurnOn+kFadeDuration) ) { // sunrise
   int foo[2];
   fader(kTurnOn, kNightState, kDayState, foo);
   set_state(foo);
     
     lcd.setCursor(0,2);
     //lcd.print("                   ");
     lcd.setCursor(3,2);
     lcd.print("SUNRISE/MODE");              
     digitalWrite(ledEnable, HIGH);
     lcd.setCursor(7,3);
     lcd.print("LED-ON");
 } else if ( ctr > (kTurnOn+kFadeDuration) && ctr < kTurnOff ) { // day
   set_state(kDayState);
     
     lcd.setCursor(0,2);
     //lcd.print("                   ");
     lcd.setCursor(5,2);            
     lcd.print("DAY/MODE");              
    digitalWrite(ledEnable, HIGH);
    lcd.setCursor(7,3);
     lcd.print("LED-ON");
 } else if ( ctr >= kTurnOff && ctr <= (kTurnOff+kFadeDuration) ) { // sunset
   int foo[2];
   fader(kTurnOff, kDayState, kNightState, foo);
   set_state(foo);
     lcd.setCursor(0,2);
     //lcd.print("                   ");
     lcd.setCursor(5,2);
     lcd.print("SUNSET/MODE");              
     //lcd.setCursor(11,2);
     //lcd.print("  ");
     digitalWrite(ledEnable, HIGH);
     lcd.setCursor(7,3);
     lcd.print("LED-ON");
 } else if ( ctr > (kTurnOff+kFadeDuration) && ctr < 86400 ) { // night
   set_state(kNightState);
     lcd.setCursor(0,2);
     //lcd.print("                   ");
     lcd.setCursor(5,2);
     lcd.print("NIGHT/MODE");        
     digitalWrite(ledEnable,LOW);
     lcd.setCursor(6,3);
     lcd.print("LED-OFF");
 }
}

/*
* Utility function for pretty digital clock time output
*/
void printDigits(int digits) {
 Serial.print(":");
 if(digits < 10)
   Serial.print('0');
 Serial.print(digits);

}
void displayDigits(int digits) {
 lcd.print(":");
 if(digits < 10)
   lcd.print('0');
 lcd.print(digits);
 
}

/*
* Display time
*/
void digitalClockDisplay() {
 Serial.print(hour());
 printDigits(minute());
 printDigits(second());
 Serial.print("  ");
 Serial.print(month());
 Serial.print("/");
 Serial.print(day());
 Serial.print("/");
 Serial.print(year());
 Serial.println();
}
void lcdClockDisplay() {
 lcd.setCursor(0,0);
 lcd.print(hour());
 displayDigits(minute());
 displayDigits(second());
 lcd.print("   ");
 lcd.print(month());
 lcd.print("/");
 lcd.print(day());
 lcd.print("/");
 lcd.print(year());
 
}
//End PWM  
void setup(void) {

//  Serial.begin(9600);
//Start PWM
 Serial.begin(115200);        // Max for Arduino Uno
 setSyncProvider(RTC.get);
 setSyncInterval(120);
 Wire.begin();
//  lcd.begin(20,4);           // initialize the lcd for 20 chars 4 lines and turn on backlight
 Timer1.initialize(6666);     // 150Hz PWM
 pinMode(kChan0Pin, OUTPUT);    
 Timer1.pwm(kChan0Pin, 0);
 pinMode(kChan1Pin, OUTPUT);    
 Timer1.pwm(kChan1Pin, 0);
//  pinMode(ledEnable,OUTPUT);   // Led control

//END PWM

 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;}}
 
//StartPWM
ctr = seconds_since_midnight(); // Original code

 determine_state();              // Original code
 Serial.print("ctr: ");
 Serial.print(ctr);              // display counter
 Serial.println();
 digitalClockDisplay();          //display time
 Serial.println();
 lcd.setCursor(0,0);            
 lcd.println();
 lcdClockDisplay();
//End PWM

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);
}

Program ma za zadanie pokazywać na wyświetlaczu zmierzone parametry (dwie temperatury, wilgotność i ciśnienie, czas i datę) oraz włączać oświetlenie przez sterowanie przekaźnikiem pin 6. Pytanie czy pin 6 nie będzie się z czymś gryzł np z wyświetlaczem? Po włączeniu przekaźnika przez piny 9 i 10 (PWM) ma przez zadany czas "rozjaśniać" ledy, następnie przez zadany czas świecić z pełną mocą aż do zadanego czasu "ściemniania" na koniec ma zostać wyłączony przekaźnik na kanale 6 Czas jest liczony dla każdego kroku (włączenie, rozjaśnianie, świecenie, ściemnianie, wyłączenie) odliczając sekundy od północy. Problem mam z wyświetlaczem, nie wiem czy tak poskładany program będzie dobrze wyświetlał informacje na zmieniających się stronach na LCD i czy będzie poprawnie działał.
Proszę o weryfikację programu i pomoc w jego ogarnięciu.
 
Odpowiedź
#20
wgraj i sprawdź niestety jak piałem nie mam żadnego z komponentów które wykorzystujesz więc nie mam jak tego sprawdzić ale po kodzie powinno być ok. nie będzie masz wyświetlacz i2c pin 6 na wyświetlaczu odnosi się do pinu na sterowaniu nim a nie na arduino.
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości