Arduino Polska Forum

Pełna wersja: Błąd kompilacji programu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć wszystkim!
Mam problem z prostym kodem. Jest to ulepszona wersja stacji pogodowej a raczej wyczesanego budzika. Projekt ma wyświetlać temperaturę z 2 czujników DS18B20, wyświetlac godzinę oraz datę i sterować przekaźnikiem przy pomocy pilota IR. Mam odbiornik TSOP2236. Tu cały kod:
Kod:
#include <RTClib.h>//Dodawanie bibliotek
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>

#define irPin 11
IRrecv irrecv(irPin);
decode_results results;

#define diodaPin 10
int diodaStatus = LOW;

OneWire oneWire(A3); //Podłączenie do A3
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki

DateTime now;//Now to jest data i czas
char daysOfTheWeek[7][12] = {"Ndz", "Pon", "Wt", "Sr", "Czw", "Pt", "Sob"};

RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x3F, 16, 2); //Ustawianie wyswietlacza lcd

void showDate(void);//Ustawianie dayt czasu i dnia
void showTime(void);
void showDay(void);


int przycisk = 6;//Przycisk do wyswietlania temperatury
int IRpin=7;
int prz = 10;
boolean stan=0;

void setup ()
{
 Serial.begin(9600);// Ustawianie transmisji UART
 pinMode(przycisk, INPUT_PULLUP);//Ustawianie przycisku jako wejscie
 lcd.begin();//Wloczenie lcd
 lcd.backlight();//Wloczenie podswietlenia lcd
 sensors.begin();//Wloczenie czujnikow
 pinMode (IRpin, INPUT);
 pinMode (prz, OUTPUT);
 irrecv.enableIRIn();

   pinMode(diodaPin, OUTPUT);

 
 
 if (! rtc.begin()) //Jesli nie moze znalesc RTC wyswietl
 {
   Serial.println("Nie moge znalesc RTC");
   while (1);
 }

 if (rtc.lostPower()) //Jesli RTC nie ma zasilania to wyswietl
 {
   Serial.println("RTc nie ma zasilania ustaw godzine!");
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
 }
 rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop ()
{

 if (irrecv.decode(&results)) {

     switch (results.value) {
        case 0xFF21DE:
           diodaStatus = ~diodaStatus;
           digitalWrite(diodaPin, diodaStatus);
           delay(250);
           break;
        }

  irrecv.resume();
  }
 
  if (digitalRead(IRpin) == LOW)  {
 delay (20);
 stan=!stan;
 digitalWrite(prz, stan) ;
 while (digitalRead(IRpin)==LOW) ;
 delay(20);
 }

 if(digitalRead(przycisk)== LOW)//Jesli przycisk jest wcisniety
 {
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Temp(W)");
   lcd.setCursor(9, 0);
   lcd.print("Temp(Z)");
   sensors.requestTemperatures();
   lcd.setCursor(1, 1);
   lcd.print(sensors.getTempCByIndex(0));
   lcd.setCursor(10, 1);
   lcd.println(sensors.getTempCByIndex(1));
   delay(4500);
   lcd.clear();
 
 }
 now = rtc.now();//Ustawianie pętli
 showDate();
 showDay();
 showTime();
}
 

void showDate()//Kod petli showDate
{
 lcd.setCursor(0,0);
 lcd.print(now.day());
 lcd.print('-');
 lcd.print(now.month());
 lcd.print('-');
 lcd.print(now.year());
}
void showDay()//Kod petli showDay
{
 lcd.setCursor(11,0);
 lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
}
void showTime()//Kod petli showTime
{
 lcd.setCursor(4,1);  
 lcd.print(now.hour());
 lcd.print(':');
 lcd.print(now.minute());
 lcd.print(':');
 lcd.print(now.second());
 lcd.print("    ");
}

Tu daje kod do obsługi TSOP2236:
Kod:
#include <IRremote.h>
#define irPin 11
IRrecv irrecv(irPin);
decode_results results;

#define diodaPin 10
int diodaStatus = LOW;

void setup() {
   irrecv.enableIRIn();

   pinMode(diodaPin, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {

     switch (results.value) {
        case 0xFF21DE:
           diodaStatus = ~diodaStatus;
           digitalWrite(diodaPin, diodaStatus);
           delay(250);
           break;
        }

  irrecv.resume();
  }
}
A tu do obsługi ds18b20:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire(A3); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki

void setup(void) {
 Serial.begin(9600);
 sensors.begin(); //Inicjalizacja czujnikow
}

void loop(void) {
 sensors.requestTemperatures(); //Pobranie temperatury czujnika
 Serial.print("Pierwszy: ");
 Serial.println(sensors.getTempCByIndex(0));  //Wyswietlenie informacji
 Serial.print("Drugi: ");
 Serial.println(sensors.getTempCByIndex(1));  //Wyswietlenie informacji
 delay(500);
}
PS. Jeśli ktoś ma chwilkę i zna się to może odpowiedzieć na mojego posta dotyczącego dziwnych znaczków na LCD
Pozdrawiam!
Nie pokazałeś błędów kompilacji, tak użyta biblioteka DS blokuje przy każdym odczycie temperatury program na 750ms, dodawanie jeszcze delay to ponad 2s jednego obiegu loop. Poczytaj kurs https://forbot.pl/blog/kursy , użyj millis, trybu async z DS, naucz się zarządzać czasem bez delay. Arduino jest łatwe, ale jak chcesz zrobić swój program to coś trzeba umieć. Jak nie masz czasu to skopiuj jakiś projekt i ciesz się, że komuś się chciało.
1, one wire na digital pin
2. RTC brak adresu I2C
itd. itd