Arduino Polska Forum
Wyświetlacz OLED 1306 + LM35 - 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: Wyświetlacz OLED 1306 + LM35 (/watek-wy%C5%9Bwietlacz-oled-1306-lm35)



Wyświetlacz OLED 1306 + LM35 - Seba_Tyb - 20-10-2017

[attachment=399]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);

}



RE: Wyświetlacz OLED 1306 + LM35 - kaczakat - 23-10-2017

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);



RE: Wyświetlacz OLED 1306 + LM35 - Seba_Tyb - 24-10-2017

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



RE: Wyświetlacz OLED 1306 + LM35 - Seba_Tyb - 24-10-2017

Dzięki sprawdzę dzisiaj, no troszkę inaczej się robi w Bascomie :-)