• 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ź
#5
(30-03-2019, 18:35)Julek Rogalski napisał(a): Cześć!
Te delay(4000) jest do  czyszczenie lcd i nie mogę z niego zrezygnować.
Mylisz się!
Przy wolnych uC często nie da się zrezygnować z delay rzędu us (przeważnie oznacza to zły wybór sprzętu) ale nie ms.
Delay ms ZWŁASZCZA kilka sekund to:
- marnowanie energii.
- niepotrzebne generowanie zakłóceń EMI.
- "blokowanie" CPU na czas delay. Przerwania działają ale program główny wyniki działania przerwań może zobaczyć dopiero za 4 sekundy! Policz, jaki musiałby być bufor UART aby z prędkością 921600 buforować dane przez 4 sekundy!
Chciałbyś używać telewizora, który reagowałby na pilota czy klawiaturę 4 sekundy?
Chciałbyś aby np prasa miażdżąca właśnie rękę reagowała na awaryjny stop po 4 sekundach?


PS
W mojej stopce jest napisane:
Cytat:Kod z Delay i/lub bez WDT (WDG) to nie kod, to DEMO!
i tak jest!
Może się nie znam ale trochę praktyki mam http://er-mik.prv.pl/projekty_avt.php a mimo to cały czas sie uczę. Teraz działam na ARM a zaczynałem od 6502, Z80, 8051.
 
Odpowiedź
#6
es2 zgadzam się. Problem rozwiązałem dawno temu ale masz racje, myliłem się.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości