Arduino Polska Forum
zawieszanie programów - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: "Projekt Arduino Polska" (https://forum.arduinopolska.pl/dzial-projekt-arduino-polska)
+--- Dział: Zarys "Projektu Arduino Polska" (https://forum.arduinopolska.pl/dzial-zarys-projektu-arduino-polska)
+--- Wątek: zawieszanie programów (/watek-zawieszanie-program%C3%B3w)



zawieszanie programów - Julek Rogalski - 30-03-2019

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



RE: zawieszanie programów - error105 - 30-03-2019

Delay(4000) ? Zrezygnuj w ogóle z tego i wtedy zobacz czy program działa


RE: zawieszanie programów - Julek Rogalski - 30-03-2019

Cześć!
Te delay(4000) jest do  czyszczenie lcd i nie mogę z niego zrezygnować.
Pozdrawiam!


RE: zawieszanie programów - kaczakat - 31-03-2019

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().


RE: zawieszanie programów - es2 - 11-05-2019

(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.


RE: zawieszanie programów - Julek Rogalski - 25-05-2019

es2 zgadzam się. Problem rozwiązałem dawno temu ale masz racje, myliłem się.