Skocz do zawartości

ESP8266 i wyświetlacz OLED-SSD1306 programowanie w Arduino IDE


sergiuszf

Pomocna odpowiedź

Witam drodzy forumowicze Jestem kompletnym początkującym z Arduino IDE. Więc proszę nie bądź dla mnie zbyt surowy. Natknąłem się na problem z zachowaniem wyświetlacza podczas działania programu licznika Geigera. Jaka jest istota pytania? Wcześniej ten program (licznik Geigera) działał u mnie dobrze na płytach Arduino Pro Mini i nie było żadnych problemów. Teraz zdecydowałem się na uaktualnienie do płyty ESP826612E. I tutaj napotkał problem. Oczywiście w Arduino IDE wpisałem odpowiednie płytki w menadżerze płyt ze strony: http://arduino.esp8266.com/stable/package_esp8266com_index.json

W programie oczywiście zmieniłem kilka nóg. Program kompiluje się i działa normalnie bez błędów. Ale po podłączeniu zasilania do płytki wyświetlacz OLED-SSD1306 128x32 zachowuje się bardzo dziwnie. Na początku wyświetlacz to tylko masa kropek, potem pasek około 8 pikseli pedzi i otwiera się początkowy ekran. Pasek przechodzi całkowicie przez jedną linię, potem zaczyna się druga linia, częściowo pojawia się obraz, a potem gdzieś pośrodku bieg linii zatrzymuje się i WSZYSTKO. Dziwna okresowa aktualizacja ekranu zaczyna się od 2-3 sekund. I tak trwa przez cały czas, dopóki nie wyłączysz zasilania.

Może konieczna byłaby zmiana biblioteki dla wyświetlacza OLED-SSD1306 128x32 na odpowiednią płytkę ESP8266-12E? Proszę doradzić, której biblioteki użyć. Wykluczyłbym całkowicie ekran początkowy, a potem może wszystko by zadziałało, ale nie wiem, jak to zrobić. Gdzie w ogóle w tym programie jest wyjście początkowego obrazu ???

Naprawdę proszę o pomoc.

W załączniku umieszczam program licznika.

Program licznika Geigera ESP8266.zip

Link do komentarza
Share on other sites

/*
#ifdef ICACHE_RAM_ATTR                                                // for esp8266
void ICACHE_RAM_ATTR handleInterrupt();
#else
void handleInterrupt();
#endif
*/

#ifdef IRAM_ATTR                                                            // for esp32
void IRAM_ATTR handleInterrupt();
#else
void handleInterrupt();
#endif

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Dnia 30.05.2022 o 12:04, 99teki napisał:

#ifdef ICACHE_RAM_ATTR                                                // for esp8266
void ICACHE_RAM_ATTR handleInterrupt();
#else
void handleInterrupt();
#endif

Mam ESP8266-12E. Nestety nie pomoglo.

 

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dnia 30.05.2022 o 11:28, farmaceuta napisał:

Bardzo dziekuje. Faktycznie zamienilem nastepujace:

//Adafruit_SSD1306 display(OLED_RESET);        -----------  tak bylo, przemiescilem w komentarze.

Adafuit_ssd1306 displey(screen_WIDTH. screen_HEIGHT, &wire, -1);      --------  Wprowadzilem,  i teraz przy podlaczaniu zasilania wyskakuje juz normalny poczatkowy ekran.

Tylko ze, nie wiem dlaczego to pracuje w kulko, czyli po 1 sekundize nastepuje RESET i znowu pojawia sie ten ekran. I tak w kulko.

Podejrzewalem, ze cos nie w porzadku z przerwaniem. Sprobowalem wylaczyc przerwanie w taki sposob:

  //Interupptions:
      // attachInterrupt(digitalPinToInterrupt(3), counting, RISING); //Interrupt
Zakomentowalem przewanie. I  CUD!!!  poczatkowy ekran zniknal, ale za to program zapacowal. Co prawde czesiowo. Czyli mozna wchodzic di menu, zmieniac ustawienia, uruchamia tryb liczika, i wszystko pracuje poza liczeniem impulsow.

Poniewaz to przerwanie wlasnie aktywuje program COUTING, czyli liczenie impulsow.

W czy moze byc blad ?

Link do komentarza
Share on other sites

//================================
//  Functions ISR
//================================
ICACHE_RAM_ATTR void counting () {
  if (timeflag == 0 && startflag == 1){
    counter ++;
  }
}

- spróbuj ten fragment

Link do komentarza
Share on other sites

4 godziny temu, 99teki napisał:

//================================
//  Functions ISR
//================================
ICACHE_RAM_ATTR void counting () {
  if (timeflag == 0 && startflag == 1){
    counter ++;
  }
}

- spróbuj ten fragment

Wielkie dzieki. Super. Teraz prawie wszystko zapracowalo tak jak malezy, za jednym wyjatkiem.

Kiedy uruchamiam licznik i aktywuje sie liczenie impulsow, to jest rejestrowany tylko pierwszy impuls. Przy tym na wyswietlacz zamiast "1" wyswietlany jakis obrazek w postaci twrzy. Czyli wymiarowo tak jak "0" tylko ze ma oczy, nos, i usta. I wiecej juz nie reaguje na impulsy.

Tak wyglada, ze COUNTER zamiast liczby zastapiony jakims kodem znaku, i juz wiecej nic nie liczy.

Co to moze byc?

W zalaczniku spakowany plik licznika.

Pozdrawiam  Sergiusz

licz-Geig-8266-experiment-3.zip

Link do komentarza
Share on other sites

18 godzin temu, 99teki napisał:

//================================
//  Functions ISR
//================================
ICACHE_RAM_ATTR void counting () {
  if (timeflag == 0 && startflag == 1){
    counter ++;
  }
}

- spróbuj ten fragment

Jeszcze jedno. CHyba pomylilem sie i wkleilem ten fragment do zgloszenia "Funktion".

Teraz wkleilem tak jak i bylo zaproponowano do "Funktion ISR":


//================================
//  Functions ISR
//================================
ICACHE_RAM_ATTR void counting () {
  if (timeflag == 0 && startflag == 1) {
    counter ++;
  }
}

Teraz juz idzie liczenie impulsow, ale zamiast liczb wyswietlany znaki, symbole, "kszaki".   Czyli zmienna "counter" nie jest zmienna licznowa tylko zmienna znakowa. Czyli wyswietla nie liczby tylko kolejne znaki tablicy kodow znakow.

Sprawdzilem wszystkie miejsca gdzie wystepuje zmienna "counter":

Zgloszenie zmiennej:

//================================================
//  Variables
//================================================
//Counter variables:
int pic = 0;
volatile long int counter = 0;       --------------------  zmienna liczbowa
int flag = 0;

Zgloszenie funkcji:

//================================
//  Functions ISR
//================================
ICACHE_RAM_ATTR void counting () {
  if (timeflag == 0 && startflag == 1) {
    counter ++;       ------------------------------------------   zmienna chyba liczbowa
  }
}

//================================
//  Functions
//================================

.......................

  if (pic == 0){
    timeElapsed = 0;
    counter = 0;     ----------------------------------     znowu znienna liczbowa

W   MAIN:

btn.tick();
  int wynikR = counter * 46 / interval;     ----------------------------   znowu operacja liczbowa

 if (timeflag == 0){
    String impunit = String(" imp.");
    impulses =  String(counter + impunit);    ------------------  tutaj wyprowadzenie na wyswietlanie sumy danych liczbowych i znakowych.

Ito wszystko wiecej nigdzie zmienna "counter" nie wystepuje.  A drukowane "krzaczki".

W czym tkwi pronlem ???

Wysylam jeszcze raz w zalaczniku szkic:

licz-Geig-8266-experiment-3.zip

Link do komentarza
Share on other sites

if (timeflag == 0){
    String impunit = String(" imp.");
    impulses =  String(counter + impunit);  

- to będzie działać pod kompilatorem AVR, pod esp32 nigdy.

- counter to typ int.

- impunit to typ string, " imp" to tez string, string(" imp.") to ja nie wiem co to.

- sprobuj:  impulses = counter + " imp." ;

- jeśli impulses to typ String, powinno działać.

- ja bym zakomentował wyświetlanie w loop , zostawił tylko np. to co powyżej  oraz print i testował kompilację dla róznych wartości.

- tu jest fajna biblioteka dla ssd1306.

https://github.com/ThingPulse/esp8266-oled-ssd1306

- inaczej to się zapętlisz chcesz od razu przy swoich umięjetnościach kompilować cały program po przeportowaniu z AVR na esp32, ciężka sprawa. 

 

Edytowano przez 99teki
Link do komentarza
Share on other sites

(edytowany)
20 godzin temu, 99teki napisał:

Tak, faktycznie to zadzialalo. Wielkir dzieki. Wprowadzilem jeszcze pare podobnych zmian. I teraz program licznika pracuje swietnie. Wszystko dziala tak jak trzeba.

Jeszcze raz dzieki. Temat zamkniety.

 

 

Edytowano przez sergiuszf
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.