Arduino Polska Forum
Zawieszanie wyświetlacza OLED - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Zawieszanie wyświetlacza OLED (/watek-zawieszanie-wy%C5%9Bwietlacza-oled)

Strony: 1 2 3 4 5 6 7 8


Zawieszanie wyświetlacza OLED - Automatyk231 - 25-10-2018

Witam wszystkich. Napisałem kod programu który odpowiada za układ regulacji trójstawny(trójpołożeniowy). Wszystko działa jak należy jednak wyświetlacz OLED zawiesza się w momencie strefy nieczułości - to znaczy : gdy wartość zadaną ustawię na np 70% a wartość wilgotności wynosi 72% to według warunku " else {}" nie powinno działać żadne urządzenie , tylko dioda LED. Tak też się dzieje jednak po chwili gdy wartość zadaną ustawiam na np.80% wartość na wyświetlaczu nie zmienia się , mimo iż przekaźnik działa jak należy. Wyświetlacz zaczyna znowu działać w momencie odłączenia i ponownego załączenia arduino do prądu. Zawieszanie wyświetlacza występuje tylko i wyłącznie właśnie w tej strefie nieczułości. Czy ktoś wie czemu tak się dzieje?

Kod programu:
Kod:
#include "DHT.h"                          // biblioteka DHT
#include "U8glib.h"                       // bibioteka OLED I2C

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C / TWI

#define DHTPIN 2                          // definicja PIN dla DHT
#define DHTTYPE DHT22                     // DHT 22
DHT dht(DHTPIN, DHTTYPE, 6);                  // deklaracja DHT
char str[10];                         // znak stopni celsujsza i procent
int WILG;                           // zmienna wilgotnosc
float TEMP;  // zmienna temperatura w stopniach C

unsigned long aktualnyCzas = 0; // do millis
unsigned long zapamietanyCzas = 0;  // do millis

int relay_pin = 8;                // przekaznik
int relay_pin2 = 12;              // przekaznik
int relay_pin3 = 7;                // przekaznik
int relay_pin4 = 9;
#define led_info_promiennik 4         // dioda od promiennika
#define led_info_generator 13      // dioda od generatora pary
#define led_info_nic 1

int histereza=2;

int potencjometr = A0;                // odczyt napiecia z potentcjometru pinem analogowym 0
int wartosc = 0;                       // zmienna przechowujaca wartosc napiecia odczytanego
int dane[5]; // do potencjometru do sredniej
int i=0;  // do potencjometru do sredniej
int srednia;  // do potencjometru do sredniej
 
void setup()
{
dht.begin();                          // inicjalizacja DHT
pinMode(potencjometr, INPUT); //pin A0 (pot) jako wejście
pinMode(relay_pin, OUTPUT);
pinMode(relay_pin2, OUTPUT);
pinMode(relay_pin3, OUTPUT);
pinMode(relay_pin4, OUTPUT);
digitalWrite(relay_pin, HIGH);
digitalWrite(relay_pin2, HIGH);
digitalWrite(relay_pin3, HIGH);
digitalWrite(relay_pin4, HIGH);
pinMode(led_info_promiennik, OUTPUT);
pinMode(led_info_generator, OUTPUT);
pinMode(led_info_nic, OUTPUT);
}

// glowna petla programu

void loop() {
aktualnyCzas = millis();

if (aktualnyCzas - zapamietanyCzas >= 50UL) {
   //Zapamietaj aktualny czas
   zapamietanyCzas = aktualnyCzas;
}
                     
WILG = dht.readHumidity();                     // odczytaj wilgotnosc
TEMP = dht.readTemperature();                  // odczytaj temp
wartosc = analogRead(A0);
dane[i]=wartosc; // do sredniej potencjoemtru
i++;
if(i==5){
i=0;
}
for(int j=0;j<5;j++){
 srednia+=dane[j]; // do sredniej potencjoemtru
}
srednia/=5.0; // do sredniej potencjoemtru
wartosc  = map(wartosc, 0, 1023, 0, 100);           // skalowanie od 0 do 100            

// petla obrazu
u8g.firstPage();              
do {
u8g.setFont(u8g_font_helvB08);               // czcionka
u8g.drawStr( 2, 27, "Wilgotnosc :");            
u8g.drawStr( 80, 27, dtostrf(WILG, 5, 2, str));  
u8g.drawStr( 110, 27, "%");                      

u8g.drawStr( 2, 42, "Temperatura :");            
u8g.drawStr( 80, 42, dtostrf(TEMP, 5, 2, str));
u8g.drawStr( 110, 42, "\260C");

u8g.drawStr( 2, 57, "Wilg. zad.:");            
u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
u8g.drawStr( 110, 57, "%");
} while( u8g.nextPage() );                       // koniec petli obrazu

// PETLA OD WARUNKOW
if(wartosc>(WILG+2)) {

digitalWrite(relay_pin2, HIGH); //Wyłączenie Promiennika
digitalWrite(relay_pin3, LOW); // ON wentylatora
digitalWrite(relay_pin4, LOW);  //ON wentylatora
digitalWrite(relay_pin, LOW);  // Wlaczenie GENERATORA PARY  
digitalWrite(led_info_generator, HIGH); //Włączenie diody od GENERATORA
digitalWrite(led_info_promiennik, LOW); //WYLACZENIE diody od PROMIENNIKA
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułości
}
else if(wartosc<(WILG-2)){


digitalWrite(relay_pin3, HIGH);  // OFF wentylatorow
digitalWrite(relay_pin4, HIGH);  // OFF wentylatorów
digitalWrite(relay_pin, HIGH);  // Wylaczenie GENERATORA
digitalWrite(relay_pin2, LOW); // Wlaczenie Promiennika
digitalWrite(led_info_promiennik, HIGH); //Włączenie diody od PROMIENNIKA
digitalWrite(led_info_generator, LOW); //Wyłączenie diody od GENERATORA
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci
}
else { // tolerancja 2 stopni odnosnie rownosci ze wzgledu na te wahania potencjometru

digitalWrite(relay_pin, HIGH); // Wyłaczenie generatora
digitalWrite(relay_pin2, HIGH); // Wyłączenie promiennika
digitalWrite(relay_pin3, HIGH);  // OFF wentylatorow
digitalWrite(relay_pin4, HIGH);  // OFF wentylatorów
digitalWrite(led_info_promiennik, LOW); //WYLACZENIE diody od PROMIENNIKA
digitalWrite(led_info_generator, LOW); //WYLACZENIE diody od GENERATORA
digitalWrite(led_info_nic, HIGH); // Włączenie diody od Strefy Nieczułosci
}

}



RE: Zawieszanie wyświetlacza OLED - es2 - 25-10-2018

Pewnie nik nie wie czemu tak się dzieje, bo:
- nie raczyłeś napisać, na czym to uruchamiasz (może Z-80?)
- nie raczyłeś dać komunikatów z kompilacji (pewnie RAM brakuje)
Mnie się szklana kula stłukła, Wróżbita Maciej po nocce śpi, więc nie jestem w stanie na w/w sobie odpowiedzieć aby pomóc.


RE: Zawieszanie wyświetlacza OLED - Automatyk231 - 25-10-2018

Arduino UNO to płytka . Wyświetlacz to : Wyświetlacz OLED niebieski graficzny 1,3'' 128x64px I2C .
Komunikaty z kompilacji to:


[Obrazek: 13712092323878167713.png]


RE: Zawieszanie wyświetlacza OLED - es2 - 25-10-2018

(25-10-2018, 11:50)Automatyk231 napisał(a): Arduino UNO to płytka . Wyświetlacz to : Wyświetlacz OLED niebieski graficzny 1,3'' 128x64px I2C .
Komunikaty z kompilacji to:


[Obrazek: 13712092323878167713.png]

Panie Automatyk231. Podstawowy kurs Arduino, później powrót na forum zanim inni Cię "dopadną"


RE: Zawieszanie wyświetlacza OLED - Automatyk231 - 25-10-2018

Tak ale nie rozumiem dlaczego się zawiesza-czy mógłbyś mnie naprowadzić mnjej więcej na właściwy trop? Byłbym wdzięczny.


RE: Zawieszanie wyświetlacza OLED - es2 - 25-10-2018

(25-10-2018, 13:11)Automatyk231 napisał(a): Tak ale nie rozumiem dlaczego się zawiesza-czy mógłbyś mnie naprowadzić mnjej więcej na właściwy trop? Byłbym wdzięczny.

Me więcej, to jak się palce wkłada w ... to jednego jest mniej a innego więcej.

Nie wiadomo co i jak robi magiczna biblioteka "U8glib.h" bo jej kodu nie załączyłeś. Jeśli ona allokuje RAM w ilości 128x64/8, to może go po prostu brakuje na stertę i/lub stos. Raczej nie jest to powodem problemów (i tak powinno zostać ok ponad 650 bajtów) ale nie zaszkodzi sprawdzić i tu masz ZONK, bo to Arduino i prostej metody nie ma. Chyba najprościej,zaimportować to pod AS7, odpalić debuger i sprawdzic zajętość RAM.


RE: Zawieszanie wyświetlacza OLED - Automatyk231 - 25-10-2018

To się trochę przeraziłem czytając to Big Grin Pierwszy raz słyszę o AS7. Ale zaznajomię się z tym tematem. Czyli w skrócie sugerujesz brak pojemności RAM? Co do bilbioteki - jest ona niezbędna do działania tego akurat wyświetlacza ale o tym dobrze wiesz.


RE: Zawieszanie wyświetlacza OLED - es2 - 25-10-2018

(25-10-2018, 13:58)Automatyk231 napisał(a): Czyli w skrócie sugerujesz brak pojemności RAM? Co do bilbioteki - jest ona niezbędna do działania tego akurat wyświetlacza ale o tym dobrze wiesz.

Co do tego RAM nie jestem pewny ale bez debugera lub analizy kodu biblioteki ciężko coś powiedzieć.

Jeśli zaś chodzi o kod biblioteki, to to jest podstawowa zaleta i wada Arduino.
Uniwersalność i "łatwość" kosztuje. Kod u jednego użytkownika zadziała a  u innego nie. Biblioteki mają tą samą nazwę a są różne.


RE: Zawieszanie wyświetlacza OLED - error105 - 25-10-2018

Lepiej użyć biblioteki ASCI pod ten wyświetlacz bo dużo mniej obciąża system - o ile nie korzystasz z grafik.


RE: Zawieszanie wyświetlacza OLED - Automatyk231 - 25-10-2018

Korzystam z samych napisów jak widać w kodzie. Jak wrócę do domu to zaznajomię się z biblioteką ASCI i spróbuję zastąpić napisy- zobaczymy jaki wyjdzie efekt Smile