Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Ekran oled a prosty miernik

adiif1 15 Lis 2017 03:40 396 17
  • #1 15 Lis 2017 03:40
    adiif1
    Poziom 8  

    Witajcie, przychodzę z pytaniem otóż chciałbym zastosować poniższy kod lecz kod nie działa, wszystko kompiluje się poprawnie...
    ekran jak esp8266 jest sprawny w 100%

    Link

    gdzie może leżeć problem?

    ekran podłączam pod D1 oraz D2

  • Pomocny post
    #2 15 Lis 2017 04:08
    rb401
    Poziom 30  

    adiif1 napisał:
    gdzie może leżeć problem?

    ekran podłączam pod D1 oraz D2


    Jeśli nie zmieniasz kodu to połączenia OLED w tym projekcie, jak widzę, są na innych pinach. Sprawdź na schemacie:
    http://circuitfreak.net/arduino-oled-voltage-meter/
    Upewnij się też czy używasz OLED w wersji z I2C (jeśli masz z SPI to musisz lekko zmodyfikować program).
    Jeśli połączenia i typ jest ok, to jeszcze możesz w linii "display.begin(SSD1306_SWITCHCAPVCC, 0x3C);" zmienić adres na 0x3D (w tej chwili nie pamiętam czy to trzeba było zmieniać dla powszechnie u nas dostępnych tych wyświetlaczy).
    Bo ten projekt powinien ruszyć raczej bez żadnych kłopotów.

  • #3 15 Lis 2017 12:32
    adiif1
    Poziom 8  

    rb401 napisał:
    adiif1 napisał:
    gdzie może leżeć problem?

    ekran podłączam pod D1 oraz D2


    Jeśli nie zmieniasz kodu to połączenia OLED w tym projekcie, jak widzę, są na innych pinach. Sprawdź na schemacie:
    http://circuitfreak.net/arduino-oled-voltage-meter/
    Upewnij się też czy używasz OLED w wersji z I2C (jeśli masz z SPI to musisz lekko zmodyfikować program).
    Jeśli połączenia i typ jest ok, to jeszcze możesz w linii "display.begin(SSD1306_SWITCHCAPVCC, 0x3C);" zmienić adres na 0x3D (w tej chwili nie pamiętam czy to trzeba było zmieniać dla powszechnie u nas dostępnych tych wyświetlaczy).
    Bo ten projekt powinien ruszyć raczej bez żadnych kłopotów.


    Używam esp8266 także jest mniej pinów, w innym programie owy ekran oled działa bez problemu
    z parametrem 0x3c także chyba jest to I2C
    praktycznie identyczny jak ten poniżej ( ewentualnie delikatnie może różnić się tyl płytki )
    Link

  • Pomocny post
    #4 15 Lis 2017 13:40
    rb401
    Poziom 30  

    adiif1 napisał:
    Używam esp8266 także jest mniej pinów, w innym programie owy ekran oled działa bez problemu


    Jeśli ESP to faktycznie piny będą inne. Nie mam niestety tu pod ręką takiego wyświetlacza akurat z I2C by zrobić test, ale z np. linku:
    http://esp8266.github.io/Arduino/versions/2.0.0/doc/reference.html
    wynika że domyślne I2C masz na pinach w Arduino nazwanych w tym opisie, jako D4 (SDA) i D5 (SCL).

    Biblioteka Adafruit_SSD1306 jest w bieżącej wersji do ESP8266 przystosowana (chyba że masz jakąś starą wersję) i w ten sposób jak w tym woltomierzu wykorzystywana powinna działać (różnica względem zwykłego Arduino to chyba tylko zakres napięcia na ADC).

    Ewentualnie spróbuj użyć najpierw ten example do biblioteki Adafruit_SSD1306:
    https://github.com/adafruit/Adafruit_SSD1306/tree/master/examples/ssd1306_128x32_i2c
    by mieć pewność że wyświetlacz masz dobrze podłączony. A później ten woltomierz, choć raczej nie widzę by obsługa wyświetlacza w tym projekcie czymś kluczowym się różniła od przykładu z Adafruit.

    W niektórych projektach widzę że przy połączeniu ESP do OLED są użyte oporniki podciągające na liniach I2C ale nie wiem czy to jest istotne.

  • Pomocny post
    #5 15 Lis 2017 14:43
    maly_ninja
    Poziom 12  

    rb401 napisał:
    W niektórych projektach widzę że przy połączeniu ESP do OLED są użyte oporniki podciągające na liniach I2C ale nie wiem czy to jest istotne.

    Jak najbardziej trzeba dołożyć rezystory podciągające SCL i SDA do VCC. Bez tych rezystorów wyświetlacz może nie działać prawidłowo.

  • Pomocny post
    #6 15 Lis 2017 15:03
    rb401
    Poziom 30  

    Ja tu jeszcze widzę w plikach wewnętrznych Arduino dotyczących różnych wersji płytek ESP8266, że z pinami od I2C jest różnie. Po prostu nazewnictwo pinów I2C np. D4 i D5 może nie pasować do konkretnej płytki.
    Tak że jest ważne na jakiej konkretnie płytce pracujesz, czy to ma "gołym" module np. ESP01 czy ESP12 czy np. na jakimś WeeMos itd. Bo w zależności od tego arduinowe nazewnictwo pinów może być różne. Przykładowo, podane przez Ciebie D1 (SCL) i D2 (SDA) pasuje do płytki nodemcu albo do WeeMos D1 mini, ale już w "dużym" WeeMos D1 to są D3 i D4. A w gołych modułach ESPxx w ogóle nie ma oznaczeń arduinowych.

  • #7 15 Lis 2017 15:13
    adiif1
    Poziom 8  

    rb401 napisał:
    Ja tu jeszcze widzę w plikach wewnętrznych Arduino dotyczących różnych wersji płytek ESP8266, że z pinami od I2C jest różnie. Po prostu nazewnictwo pinów I2C np. D4 i D5 może nie pasować do konkretnej płytki.
    Tak że jest ważne na jakiej konkretnie płytce pracujesz, czy to ma "gołym" module np. ESP01 czy ESP12 czy np. na jakimś WeeMos itd. Bo w zależności od tego arduinowe nazewnictwo pinów może być różne. Przykładowo, podane przez Ciebie D1 (SCL) i D2 (SDA) pasuje do płytki nodemcu albo do WeeMos D1 mini, ale już w "dużym" WeeMos D1 to są D3 i D4. A w gołych modułach ESPxx w ogóle nie ma oznaczeń arduinowych.


    czyli reasomując co powinnienem zrobić bo już ręce rozkładam D4 oraz D5 również nie reagują... jeżeli oporniki były by potrzebne to ekran nie działał by wcale a w innych programach typu wifi jammer reaguje idealne :/ także jest to dziwna sprawa ... wszelakie "how-to" z neta nie pomagają a ja już rozkładam ręce i mam mega mętlik w głowie

  • #8 15 Lis 2017 15:22
    rb401
    Poziom 30  

    adiif1 napisał:
    a ja już rozkładam ręce i mam mega mętlik w głowie


    Powoli :) .
    Napisz konkretnie (bo nie mogę na 100% wywnioskować z tego co piszesz):
    Czy z Twoim ESP8266 ten wyświetlacz działał poprawnie w jakimkolwiek programie?
    Jaką bibliotekę do oleda użyłeś o ile Ci działało?
    Jaką płytkę stosujesz, bo samo pojęcie esp8266 jest bardzo szerokie?

  • #9 15 Lis 2017 16:02
    adiif1
    Poziom 8  

    rb401 napisał:
    adiif1 napisał:
    a ja już rozkładam ręce i mam mega mętlik w głowie


    Powoli :) .
    Napisz konkretnie (bo nie mogę na 100% wywnioskować z tego co piszesz):
    Czy z Twoim ESP8266 ten wyświetlacz działał poprawnie w jakimkolwiek programie?
    Jaką bibliotekę do oleda użyłeś o ile Ci działało?
    Jaką płytkę stosujesz, bo samo pojęcie esp8266 jest bardzo szerokie?


    1.Tak działa przykładowo Link
    2.
    Code:

    #include <Wire.h>
    #include "SSD1306.h"
    SSD1306 display(0x3c, 5, 4); //GPIO 5 = D1, GPIO 4 = D2

    3.
    Code:
    Moduł WiFi ESP8266 + NodeMCU v2 oraz Moduł WiFi ESP8266 + v3 [ podobno jakiś chiński klon ]

  • #10 15 Lis 2017 16:21
    rb401
    Poziom 30  

    adiif1 napisał:
    1.Tak działa przykładowo Link
    2.
    Kod:

    #include <Wire.h>
    #include "SSD1306.h"
    SSD1306 display(0x3c, 5, 4); //GPIO 5 = D1, GPIO 4 = D2


    No to fajnie. Czyli połączeń nie ruszaj bo są dobre.
    Jedynie kwestia wygląda na różnice w bibliotekach. W woltomierzu użyta jest Adafruit_SSD1306 a chodziła ci dobrze SSD1306.h prawdopodobnie któraś wersja Fabrice Weinberga.
    Co do pinów po jakich sterują wyświetlaczem to raczej nie spodziewałbym się różnic bo pomijając to różne nazewnictwo arduinowe konkretnie w obydwu przypadkach chodzi o te same fizyczne piny kostki ESP8266 na których w Arduino domyślnie jest I2C.

    Spróbuj może zmienić linijkę "#define OLED_RESET 4" na "#define OLED_RESET 16". Komuś gdzieś tam pomogło.

  • #11 15 Lis 2017 19:55
    adiif1
    Poziom 8  

    rb401 napisał:
    adiif1 napisał:
    1.Tak działa przykładowo Link
    2.
    Kod:

    #include <Wire.h>
    #include "SSD1306.h"
    SSD1306 display(0x3c, 5, 4); //GPIO 5 = D1, GPIO 4 = D2


    No to fajnie. Czyli połączeń nie ruszaj bo są dobre.
    Jedynie kwestia wygląda na różnice w bibliotekach. W woltomierzu użyta jest Adafruit_SSD1306 a chodziła ci dobrze SSD1306.h prawdopodobnie któraś wersja Fabrice Weinberga.
    Co do pinów po jakich sterują wyświetlaczem to raczej nie spodziewałbym się różnic bo pomijając to różne nazewnictwo arduinowe konkretnie w obydwu przypadkach chodzi o te same fizyczne piny kostki ESP8266 na których w Arduino domyślnie jest I2C.

    Spróbuj może zmienić linijkę "#define OLED_RESET 4" na "#define OLED_RESET 16". Komuś gdzieś tam pomogło.


    Zamiana oled_reset pomogła! wszystko śmiga pięknie
    Code:
    int sensorValue = analogRead(A0);


    Rozumiem że tu mogę dać przykładowo D0? patrząc na
    Link

    dziwna sprawa miernik 1.3 arduino 2.2 0.0

  • #12 15 Lis 2017 20:11
    rb401
    Poziom 30  

    adiif1 napisał:
    Zamiana oled_reset pomogła! wszystko śmiga pięknie


    Myślę że przyczyną było to że linia sprzętowego resetu (4) wyświetlacza (zresztą nie używana w tych wyświetlaczach) kolidowała z linią 4 akurat tu w ESP użytą w I2C jako SDA.
    A kod był pisany na normalne Arduino gdzie I2C jest na innych fizycznie pinach.
    Ale nieważne. Ważne że Ci ruszyło.

    adiif1 napisał:
    Kod:
    int sensorValue = analogRead(A0);


    Rozumiem że tu mogę dać przykładowo D0? patrząc na
    Link


    Tu z opisu wynika według mnie że jedynym pinem na którym działa ADC jest pin ADC nazwany arduinowo A0. I obawiam się że tu nie ma żadnej alternatywy.

  • #13 15 Lis 2017 20:12
    adiif1
    Poziom 8  

    rb401 napisał:
    adiif1 napisał:
    Zamiana oled_reset pomogła! wszystko śmiga pięknie


    Myślę że przyczyną było to że linia sprzętowego resetu (4) wyświetlacza (zresztą nie używana w tych wyświetlaczach) kolidowała z linią 4 akurat tu w ESP użytą w I2C jako SDA.
    A kod był pisany na normalne Arduino gdzie I2C jest na innych fizycznie pinach.
    Ale nieważne. Ważne że Ci ruszyło.

    adiif1 napisał:
    Kod:
    int sensorValue = analogRead(A0);


    Rozumiem że tu mogę dać przykładowo D0? patrząc na
    Link


    Tu z opisu wynika według mnie że jedynym pinem na którym działa ADC jest pin ADC nazwany arduinowo A0. I obawiam się że tu nie ma żadnej alternatywy.


    Odnalazłem takowy A0 :D

    jednak dziwna sprawa miernik 1.3 arduino 2.2 ://

  • #14 15 Lis 2017 20:47
    rb401
    Poziom 30  

    adiif1 napisał:
    jednak dziwna sprawa miernik 1.3 arduino 2.2 ://


    Ale tu na ESP będzie inny zakres napięcia ADC niż na klasycznym Arduino i trzeba w tym fragmencie:

    int sensorValue = analogRead(A0);
    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
    float voltage = sensorValue * (5.0 / 1023.0);

    odpowiednio zmienić stałą napięcia.
    Reference od esp opisuje jako zakres ADC 0-1V (0-1.1V w niektórych źródłach). Jako wartość na samej kostce ESP8266.
    Ale to nie za bardzo pasuje do Twoich pomiarów i prawdopodobnie jest tu jeszcze na samej płytce zrobiony dzielnik napięcia podawanego na pin ADC, obniżający napięcie koło trzech razy. Zresztą znalazłem jakiś schemat nodemcu i tam te oporniki widać:
    Ekran oled a prosty miernik

    Czyli przypuszczam że wejście na Twojej płytce (powiedzmy że oznaczone jako A0) ma rzeczywisty zakres gdzieś ok. 0-3,3V.
    Czyli w tym fragmencie powyżej zastępujesz wartość 5.0 wartością 3.3 i dostaniesz prawie realną wartość odczytu. Niekoniecznie będzie to precyzyjnie bo też nie wiadomo jaki jest przyjęty rozrzut parametrów wpływający na pomiar (np. dobór tych oporników w dzielniku wydaje się być raczej przybliżony)
    By było dokładniej możesz ten współczynnik wyznaczyć doświadczalnie (skalibrować) już bardziej precyzyjnie skoro masz miernik do porównania.

  • #15 15 Lis 2017 20:52
    adiif1
    Poziom 8  

    rb401 napisał:
    adiif1 napisał:
    jednak dziwna sprawa miernik 1.3 arduino 2.2 ://


    Ale tu na ESP będzie inny zakres napięcia ADC niż na klasycznym Arduino i trzeba w tym fragmencie:

    int sensorValue = analogRead(A0);
    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
    float voltage = sensorValue * (5.0 / 1023.0);

    odpowiednio zmienić stałą napięcia.
    Reference od esp opisuje jako zakres ADC 0-1V (0-1.1V w niektórych źródłach). Jako wartość na samej kostce ESP8266.
    Ale to nie za bardzo pasuje do Twoich pomiarów i prawdopodobnie jest tu jeszcze na samej płytce zrobiony dzielnik napięcia podawanego na pin ADC, obniżający napięcie koło trzech razy. Zresztą znalazłem jakiś schemat nodemcu i tam te oporniki widać:
    Ekran oled a prosty miernik

    Czyli przypuszczam że wejście na Twojej płytce (powiedzmy że oznaczone jako A0) ma rzeczywisty zakres gdzieś ok. 0-3,3V.
    Czyli w tym fragmencie powyżej zastępujesz wartość 5.0 wartością 3.3 i dostaniesz prawie realną wartość odczytu. Niekoniecznie będzie to precyzyjnie bo też nie wiadomo jaki jest przyjęty rozrzut parametrów wpływający na pomiar (np. dobór tych oporników w dzielniku wydaje się być raczej przybliżony)
    By było dokładniej możesz ten współczynnik wyznaczyć doświadczalnie (skalibrować) już bardziej precyzyjnie skoro masz miernik do porównania.


    czyli jeżeli dobrze zrozumiałem "precyzyjne" ustawienie = 1 typ batteri?
    w głównej mierze zależy mi na ogniwach 18500 także jeżeli ustawie powiedzmy 3.7*1023 to już przykładowo paluszek AA będzie przekłamany?

    edit: coś jest nie tak ;/
    4.0v 18500 pokazuje 4.1 także ok
    2.5 pokazuje 3.6v także mam zagwostkę jak to naprawić

  • #16 15 Lis 2017 21:27
    rb401
    Poziom 30  

    adiif1 napisał:
    czyli jeżeli dobrze zrozumiałem "precyzyjne" ustawienie = 1 typ batteri?
    w głównej mierze zależy mi na ogniwach 18500 także jeżeli ustawie powiedzmy 3.7*1023 to już przykładowo paluszek AA będzie przekłamany?


    To nie tak. Jeśli zmierzysz poprawnie 3,7V to i zmierzysz poprawnie 1,5V i jakiekolwiek inne napięcie (byle było w zakresie).

    Po prostu (używając pewnych przybliżeń) "goły" układ ESP8266 (ściślej jego przetwornik ADC) przetwarza napięcie na swojej nóżce tak że napięciu 0V odpowiada liczba 0 a napięciu 1V liczba 1023. Większe napięcie niż to 1V daje też 1023.
    Dlatego właśnie jest w wypadku ESP potrzebny ten dzielnik napięcia i równoczesne uwzględnienie jego stopnia podziału dla przeliczenia liczby z przetwornika (tej którą uzyskuje się z funkcji analogRead(A0)) by wyliczyć napięcie w woltach.
    Dla klasycznego Arduino można wprost mierzyć 0-5V, bo taki jest zakres jego ADC.


    Właściwym problemem jest w Twoim przypadku to że jeśli masz na płytce dzielnik jaki tu na tym schemacie, który znalazłem, to masz możliwość pomiaru napięcia tylko do około 3,3V bo większe napięcia i tak pokaże Ci jako 3,3V.
    Czyli musisz zmienić stopień podziału tego dzielnika. Np. jeśli ten dzielnik przekształcisz na stopień podziału 1:5 to będziesz mógł mierzyć napięcia 0-5V itd. .

    Modyfikacja by była dość prosta bo wystarczy dodać na linię A0 dodatkowy szeregowy opornik. Ale trzeba by najpierw spróbować określić jakie wartości mają te oporniki w dzielniku na Twojej płytce (masz klona to niekoniecznie muszą byc takie jak w oryginale).
    Mając te wartości można już wyznaczyć jakiej wartości będzie potrzebny opornik dodatkowy. Tu nie musi być zachowana jakaś super precyzja bo i tak niedokładności "skasuje" kalibracja tego współczynnika z wzoru za pomocą porównania z innym miernikiem.
    Tak że musiałbyś zacząć od ustalenia jaka górna wartość mierzonego napięcia będzie Ci potrzebna.

  • #17 15 Lis 2017 21:31
    adiif1
    Poziom 8  

    Górna granica której szukam to maksymalnie 4.2V bo tyle maja 18500 czyli w tym wypadku muszę kombinować z rezystorami aby dobrać odpowiednie wartości? Czy w necie znajdę jakieś gotowe ?kalkulatory??

  • #18 15 Lis 2017 23:28
    rb401
    Poziom 30  

    adiif1 napisał:
    Gorna granica ktorej szukam to maksymalnie 4.2V bo tyle maja 18500 czyli w tym wypadku musze kombinowac z rezystorami?


    Nie warto tak dokładnie ustawiać zakres pomiarowy. Spokojnie możesz ustawić sobie zakres gdzieś około 5V. I Jeśli powiedzmy górny zakres wypadnie ci na 5,3V albo 4,7V to nie ma żadnej tragedii bo i tak doświadczalnie obliczysz i wstawisz odpowiednią stałą do programu. Nie musisz też szukać i dobierać precyzyjnie opornika.
    Jeśli masz wartości w dzielniku takie jak na schemacie oryginalnego nodemcu czyli 100kΩ i 220kΩ to jak dodasz szeregowo opornik ok. 200kΩ to będziesz z pełnym zakresem właśnie około 5V.
    Ale warto byś się przyjrzał na swojej płytce czy zdołasz je zidentyfikować i odczytać ich oznaczenia. Ewentualnie możesz je zmierzyć (przy niezasilanej płytce) omomierzem.

    Jeśli nawet Ci się nie uda określić ich wartości, to można też opornik dodatkowy wyznaczyć doświadczalnie.
    W programie zamiast linijki "display.print(voltage); display.println("V");" dać wyświetlanie surowej liczby z przetwornika czyli "display.print(sensorValue); display.println("");".
    I podłączyć jakiś opornik na próbę (np. te 200kΩ), następnie zmierzyć np. bateryjkę 1,5V (zweryfikowaną pomiarem miernikiem) i zobaczyć jakiej liczbie odpowiada to konkretne napięcie.
    Następnie używając proporcji obliczyć jakie napięcie będzie odpowiadało liczbie 1023. I to będzie właśnie napięcie górne zakresu. Jeśli będzie około 5V to ok, jeśli inaczej to inny opornik wstawić na próbę.

    Dodano po 1 [godziny] 29 [minuty]:

    Jeśli używasz płytki nodemcu z firmy RobotDyn to sprawa wygląda prosto. Oglądałem te płytki i dzielniki napięcia na A0 są z takich oporników jak w oryginale.
    Czyli jeśli to konkretnie taka płytka to nie ma problemu i nie są potrzebne żadne dodatkowe wyznaczenie wartości opornika.
    Dokładasz opornik 200kΩ (może być np. 220kΩ) szeregowo na połączeniu z A0 i gotowe.
    Robisz tylko pomiar jakiegoś znanego napięcia (najlepiej około 4V np. LiIon ) i wyznaczasz dokładną wartość tej stałej u Ciebie w programie. I po robocie.

 
Black Friday do -15%
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
Ferguson