• 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
Wyświetlacz OLED 1306 + LM35
#1
    Witam, mm problem z wyświetleniem temp. na tym wyświetlaczu OLED SSD1306, nazwę sobie wyświetliłem lecz odczyt to mam kreska kropka....., załączyłem monitor portu szeregowego i temp. działa. Z arduino dopiero zaczynam....
Pod spodem daję kod./// Proszę o pomoc
Kod:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

float temperatura;  

int a;

void setup()  {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
   display.clearDisplay();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Temperatura na dworzu");
}
void loop() {
a = analogRead(A0); //Odczytanie napięcia z czujnika temperatury
temperatura = a * 0.48828125; //Wyznaczenie temperatury


display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(20,30);
display.println(temperatura);
display.display();

//Dodatkowe wyświetlenie temperatury w serial port
  Serial.print("Temperatura: ");
  Serial.println(temperatura);

delay (1000);

}
 
Odpowiedź
#2
Witam

W pętli głównej powinieneś czyścić wyświetlacz i wysyłać wynik temperatury, bo mogą się nakładać wyniki poprzednie jeśli nowe są krótsze. Czyli powtórz część kodu z setup. Można też czyścić tylko wybrane wiersze/zakresy ekranu by działało szybciej i tylko tę część odświeżać, ale tego się nauczysz później.
Jeśli działa wyświetlanie "napisu" to zamień najpierw wynik temperatury na "napis" i zobacz czy pomoże. Zwykle funkcje obsługują wysyłanie napisów, akurat "Serial.print()" jest bardzo rozbudowana i sama sobie zamienia int, float na napisy i wysyła, ta z oleda niekoniecznie taka musi być.
Kod:
String napis=String(temperatura);
i potem
Kod:
display.println(napis);
String występuje tu jako typ danych String i jako funkcja String() do konwertowania na napisy.
Dodatkowo podejrzewam, że nie ma sensu używać float do tej temperatury, ten czujnik ma pewnie dokładność +/-2oC, można więc użyć typu int. 

Kod:
a = analogRead(A0); //Odczytanie napięcia z czujnika temperatury
a = (a * 488)/1000;
//i potem
display.println(a);
To da ten sam wynik tylko jako liczbę całkowitą.
 
Możesz zobaczyć czy z int'ami sobie rodzi ta funkcja display.println();. Zysk to również większa szybkość i mniej kodu wynikowego. Na AVR lepiej unikać float.

Można też podzielić tę liczbę po mnożeniu na część całkowitą dzieląc przez 1000 i potem resztę wyświetlić jako sklejony napis, ale  i tak zadziała szybciej i da pewnie mniej kb kodu niż użycie float: 
Kod:
a = analogRead(A0); //Odczytanie napięcia z czujnika temperatury
String napis=(String((a*488)/1000)+"."+ String((a*488)%1000)));
//i potem
display.println(napis);
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(23-10-2017, 19:53)kaczakat napisał(a): Witam

W pętli głównej powinieneś czyścić wyświetlacz i wysyłać wynik temperatury, bo mogą się nakładać wyniki poprzednie jeśli nowe są krótsze. Czyli powtórz część kodu z setup. Można też czyścić tylko wybrane wiersze/zakresy ekranu by działało szybciej i tylko tę część odświeżać, ale tego się nauczysz później.
Jeśli działa wyświetlanie "napisu" to zamień najpierw wynik temperatury na "napis" i zobacz czy pomoże. Zwykle funkcje obsługują wysyłanie napisów, akurat "Serial.print()" jest bardzo rozbudowana i sama sobie zamienia int, float na napisy i wysyła, ta z oleda niekoniecznie taka musi być.
Kod:
String napis=String(temperatura);
i potem
Kod:
display.println(napis);
String występuje tu jako typ danych String i jako funkcja String() do konwertowania na napisy.
Dodatkowo podejrzewam, że nie ma sensu używać float do tej temperatury, ten czujnik ma pewnie dokładność +/-2oC, można więc użyć typu int. 

Kod:
a = analogRead(A0); //Odczytanie napięcia z czujnika temperatury
a = (a * 488)/1000;
//i potem
display.println(a);
To da ten sam wynik tylko jako liczbę całkowitą.
 
Możesz zobaczyć czy z int'ami sobie rodzi ta funkcja display.println();. Zysk to również większa szybkość i mniej kodu wynikowego. Na AVR lepiej unikać float.

Można też podzielić tę liczbę po mnożeniu na część całkowitą dzieląc przez 1000 i potem resztę wyświetlić jako sklejony napis, ale  i tak zadziała szybciej i da pewnie mniej kb kodu niż użycie float: 
Kod:
a = analogRead(A0); //Odczytanie napięcia z czujnika temperatury
String napis=(String((a*488)/1000)+"."+ String((a*488)%1000)));
//i potem
display.println(napis);
 
Odpowiedź
#4
Dzięki sprawdzę dzisiaj, no troszkę inaczej się robi w Bascomie :-)
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości