• 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
Błąd kompilacji programu
#1
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!
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
1, one wire na digital pin
2. RTC brak adresu I2C
itd. itd
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości