• 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
zawieszanie programów
#1
Witam!
Robię "stacje pogodową" i napotkałem problem. Mianowicie po wgraniu programu na Arduino Nano po przyciśnięciu przycisku (uruchomieniu funkcji pogoda) czas sie zatrzymuje i muszę resetować arduino. Czy wynika to z wielkości programu? Nie powinno bi zajmuje tylko 52% całej pamięci. proszę  o pomoc. przed dodaniem funkcji do czujnika DHT wszystko płynnie działało.
Kod:
#include "DHT.h"
#include <Wire.h>//Dodawanie bibliotek
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_BMP085.h>
#include <IRremote.h>
#include <RTClib.h>

#define prz 9
#define irPin 11
#define przycisk 10
#define DHTPIN 2
#define DHTTYPE DHT22

IRrecv irrecv(irPin);
decode_results results;

LiquidCrystal_I2C lcd(0x27, 20, 4);  // Ustawienie adresu ukladu na 0x27

DHT dht(DHTPIN, DHTTYPE);

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

Adafruit_BMP085 bmp;//Inicjalizacja czujnika bmp180

DateTime now;
char daysOfTheWeek[7][12] = {"Niedziela", "Poniedzialek", "Wtorek", "Sroda", "Czwartek", "Piatek", "Sobota"};
RTC_DS3231 rtc;

void showDate(void);
void showTime(void);
void showDay(void);




int przStatus = LOW;


void setup() {
 pinMode(przycisk, INPUT_PULLUP);
 pinMode(prz, OUTPUT);//Ustawienie
 lcd.init();
 lcd.backlight(); // zalaczenie podwietlenia
 sensors.begin();//Wloczenie czujnikow
 irrecv.enableIRIn();
 dht.begin();
 
 if (!bmp.begin()) {//Petla wykonan gdy nie znajdzie czuujnika bmp
 lcd.setCursor(0, 0);
 lcd.print("       ERROR!       ");
 lcd.setCursor(0, 1);
 lcd.print("       BMP180       ");
   while (1) {}
 }
 if (! rtc.begin())
 {
   lcd.setCursor(0,0);
   lcd.print("     RTC ERROR!     ");
   while (1);
 }

}

void loop() {

 now = rtc.now();
 showDate();
 showDay();
 showTime();

 

 if(digitalRead(przycisk)==HIGH){
   pogoda();
 }

  if (irrecv.decode(&results)) { //Jesli czujnik odbirze sygnał
     
   
     switch (results.value) {
        case 0xFF30CF:
           pogoda();
           break;
        case 0xFF18E7:
           przStatus = ~przStatus;
           digitalWrite(prz, przStatus);
           delay(250);
           break;
         
           
        }

  irrecv.resume();
  }
 
}
 


void pogoda() { //Petla pogody

  int sensorA = analogRead(A0);
  int sensorD = digitalRead(8);
  int opady =map (sensorA,1023,0,0,100);
   float h = dht.readHumidity();
 float t = dht.readTemperature();
 lcd.print("       Pogoda       ");
 sensors.requestTemperatures(); //Pobranie temperatury czujnika
 lcd.setCursor(0,1);
 lcd.print("Temp(Z): ");
 lcd.print(sensors.getTempCByIndex(0));  //Wyswietlenie informacji
 lcd.setCursor(14,1);
 lcd.print("C*");
 lcd.setCursor(0, 2);
 lcd.print("Temp(W): ");
 lcd.print(sensors.getTempCByIndex(1));  //Wyswietlenie informacji
 lcd.setCursor(14,2);
 lcd.print("C*");
 lcd.setCursor(0,3);
 lcd.print("Cisnienie: ");
 lcd.print(bmp.readPressure()/100);//Wyswietlenie cisnienia z bmp180  
 lcd.print(" hPa");
 delay(4000);
 lcd.clear();
 lcd.print("       Pogoda       ");
 lcd.setCursor(0,1);
 lcd.print("Opady: ");
   if (sensorD==1) {
    lcd.print("Sucho");}
 else{
 lcd.print("Pada");
 delay(1000);
}
 lcd.setCursor(0,2);
 lcd.print("Wilg: ");
 lcd.print(h);
 delay(4000);
 lcd.clear();
 
}

void showDate()
{
 lcd.setCursor(2,0);
 lcd.print(now.day());
 lcd.print('.');
 lcd.print(now.month());
 lcd.print('.');
 lcd.print(now.year());
}
void showDay()
{
 lcd.setCursor(2,3);
 lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
}
void showTime(){

 lcd.setCursor(2,1);
 lcd.print(now.hour());
 lcd.print(':');
 lcd.print(now.minute());
 lcd.print(':');
 lcd.print(now.second());
 lcd.print("    ");
}
 
Odpowiedź
#2
Delay(4000) ? Zrezygnuj w ogóle z tego i wtedy zobacz czy program działa
 
Odpowiedź
#3
Cześć!
Te delay(4000) jest do  czyszczenie lcd i nie mogę z niego zrezygnować.
Pozdrawiam!
 
Odpowiedź
#4
Delay w programach najczęściej nie jest do niczego potrzebny. By odpowiednio zarządzać czasem, np. by nie zmieniać czasu led częściej niż co sekundę wystarczy zmienić podejście, zamiast blokować program na 1s (czy tam operacji na LCD) wystarczy ignorować zmianę stanu led przez sekundę od ostatniej zmiany - użyć odpowiednio znaczników upływu ms z funkcji millis().
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości