• 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
Arduino i LCD Nokia 5110
#11
Ja mam kilka takich TFT. Profesjonalne mierniki korzystają z czujników, których czas pomiaru może wynosić >1s, po co wtedy odświeżanie poniżej 1s. A statyczne obrazki wyglądają elegancko. Nie ma też powodu by wysyłać co 25ms cały ekran,   można odświeżać wybrane fragmenty ekranu. Arduino to nie tylko Atmega328, są również army za 2$ jak blue pill, ESP, do tego 5$ za ekran i można się dobrze bawić. Na youtubie są wrzutki i z filmami odtwarzanymi z SD, nie tylko fotografie. Nikt nie każe też trzymać całego ekranu w buforze, nie można by wtedy uruchamiać tych fajnych oledów na Attiny, a widziałem parę gierek i stacji pogodowych tak zrobionych. 
Jak zwykle Pana opinia jest niezwykle cenna. Nie pierwszy raz słyszę, że arduino to zabawki  Huh . Ależ taki PRO musi się tu męczyć z nami amatorami, podziwiam, musi mieć Pan twardą psychikę.
W załączniku widać jak można tak napisać program by atmega328 nie miała co robić z czasem, a animacji może być kilka na ekranie.
Kod:
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C

// Define proper RST_PIN if required.
#define RST_PIN -1

SSD1306AsciiAvrI2c oled;
//------------------------------------------------------------------------------
void setup() {
 Wire.begin();
 Wire.setClock(400000L);
#if RST_PIN >= 0
 oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
 oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0

 oled.setFont(font8x8dzida);// w tych fontach są strzalki zamiast cyfr 0-7


 oled.clear();
 oled.println("01234567");

 oled.println();
 oled.set2X();
 oled.println("01234567");

oled.setFont(Adafruit5x7);
oled.print("To zostanie" );
//oled.set1X();
delay(1000);
oled.setFont(font8x8dzida);

}
//------------------------------------------------------------------------------
void loop() {
 oled.set1X();// to szybszy sposób, zmieniamy jeden wiersz oleda (8px)
 
 oled.clear(0, 8, 0, 0); //pamięć ekranu w oled podzielona jest na 8 wierszy, mozna tez czyscic wybrany zakres od piksela do pixela
 static uint8_t licznik=0;

   oled.print(licznik++);
   if (licznik>6) licznik=0;
 oled.set2X();
//oled.setCursor(48, 4);
static uint8_t licznik2=7; //dzida kreci w drugą strone
oled.clear(112, 128, 2, 3); // tu czyscimy w wierszu 2 i 3 od pixela 112 do 128
oled.print(licznik2--);
if (licznik2<1) licznik2=7;
 delay(50); // to tylko dlatego, bo atmega sie nudzi


 }
Zmodyfikowałem kod biblioteki o plik z dzidami, także go tu dorzucam (oryginalna tutaj: https://github.com/greiman/SSD1306Ascii ), można też je wkleić na końcu wybranej czcionki. Analogicznie można w ten sam sposób rysować radar pokazany przez Robsona. Podzielić sobie ekran na różne segmenty, czyścić/wrzucać im zawartość wg potrzeb.


Załączone pliki Miniatury
   

.zip   SSD1306Ascii.zip (Rozmiar: 1.1 MB / Pobrań: 3)
Miło być decenianym https://buycoffee.to/kaczakat
 
#12
Napisać działający program a działający poprawnie to dwie różne sprawy. Problem dotyczy także bibliotek! Słynne millis i przepełnienie. Nieużywanie ATOMIC_BLOCK przy operacjach wymagających tego, to podstawowe grzechy Arduinowców. Błąd millis wyjdzie po ok 49dniach, błąd ATOMIC_BLOCK może wyjść po kilku latach. Jak pisze program aby coś sprawdzić (jakiś układ peryferyjny) to robię to w stylu Arduino (delay itp), jak jestem zadowolnowy z działania pisze to "po ludzku", najczęściej na przerwaniach, z kontrolą błędów, logami błędów.
Ile programów na Arduino odczytuje adres programu, który wywołał zadziałanie watchdoga?
Nie widziałem ani jednego, bardziej skomplikowanego programu na Arduino napisanego poprawnie. Albo Arduinowcy piszą je źle, albo jest ona tak zmieniony, że z Arduino nie ma nic wspólnego.

Ten przykładowy program z sterownikiem SSD1306 używa przerwań do transmisji danych do wyświetlacza?
 
#13
Rozpętałem tutaj jakąś fajną dyskusyjkę Tongue
... może skutkiem tej dyskusji będzie super wyglądający "radar like" animowany ekran w moim projekciku Tongue

Ale tak poważnie, Panowie ... to nie jest projekt wymagający jakiegoś niewiadomo jak wysublimowanego programu. Zrobiłem to "coś" na użytek własny, nie na pokaz i jedyne o co mi chodzi to "bajer" który w zasadzie niczego nie wniesie poza tym, że będzie fajnie wyglądał.
Nie znaczy to jednak, że to co napisaliście przejdzie bokiem albo pominę. Wręcz przeciwnie, zagłębię się w temat i będę tworzył.
Dziękuję serdecznie za udzielenie się w temacie.

Pozdrawiam i oczywiście będę informował o postępach.
 
#14
(16-04-2018, 12:39)RobUK napisał(a): i jedyne o co mi chodzi to "bajer" który w zasadzie niczego nie wniesie poza tym, że będzie fajnie wyglądał.
No i aby dobrze zrobić tan "baje"r, aby nie spowalniał działania reszty programu a animacja nie miała zacięć można poświęcić więcej czasu niż na resztę programu. Dlatego z "bajerami" i to na grafice, trzeba uważać.
 
#15
Znalazłem artykuł w którym opisane jest millis() vs delay().

Z nadzieją, że te przykłady pozwolą mi w pełni zrozumieć różnicę będę ćwiczył je dzisiaj wieczorem Tongue

Jeszcze tylko muszę znaleźć nieco więcej informacji i przykładów dotyczących przerwań i jak to powinienem zrobić ... czy może nie doczytałem ? ...
czyli jak odpalić kręcenie silnika i jednocześnie animację.

Pozdrawiam
 
#16
(16-04-2018, 13:20)RobUK napisał(a): czyli jak odpalić kręcenie silnika i jednocześnie animację.
Trochę napisałem tu https://www.forbot.pl/forum/topics74/obs...t15407.htm
Na tą chwile przedostatni post.
Założyłem też https://www.forbot.pl/forum/topics74/wie...htm#126067
ale jak na razie jest tam tylko mądrzenie, bez konkretów.
 
#17
Myślę, że coś z tego bedzie, co prawda w tej chwili nie mam czasu żeby się zagłębić ale pobierzne "poczytanie" spowodowało pewnego rodzaju lawinę myśli i wizualizacji w moim "łepie" więc chyba się uda.

Jak by co, będę pisał.
 
#18
Poznaj używane biblioteki, jakie mają możliwe do zastosowania metody. Zrobiłeś w programie dużo zakamarków, gdzie program wpada, kuca, zamyka uszy i oczy i robi sobie przerwę - delay(). Przy takim programie musisz grzebnąć głębiej. Na początek jednak proponuję podmianę stepper.h na AccelStepper.h http://42bots.com/tutorials/28byj-48-ste...duino-uno/ . stepper.h jest takim delay(), jak korzystając z tej biblioteki ustawisz mu 500 kroków do przejścia to on będzie to robił dopóki nie wypełni zadania.  W AccelStepper.h naciskasz np. przycisk ustawiasz mu do przejścia 500 kroków/cel w krokach i kończysz obsługę silnika. Lub po prostu tak samo każesz mu utrzymywać prędkość w lewo dopóki przycisk jest wciśnięty. Ale w czasie wciśnięcia przycisku program przelatuje pętlę loop() tysiące razy. Zostawiasz tylko w pętli głównej stepper.run() i ta funkcja sprawdza, czy minął już czas by zrobić kolejny krok, czy taki krok w ogóle jest do zrobienia, jeśli tak to go robi. To będzie jednak źle działać w połączeniu z wyświetlaniem menu z dalay(). Tu też powinieneś mieć to tak zrobione, że sobie modyfikujesz menu, a wyrzucasz na ekran w określonych interwałach, ale tylko jeśli to konieczne - coś się zmieniło na ekranie. Biblioteka z adafruit też działa tak, że ma bufor całego ekranu, modyfikujesz zawartość ekranu w pamięci procka, a wysyłasz całe ekrany funkcją display.display(). I przy takim programie nie ma sensu tego zmieniać. Przy takim skomplikowaniu nie jest konieczne używanie przerwań. Wystarczy poukładać sobie wszystko w pętli głównej. Przerwania są konieczne gdy coś nie może czekać, musi się wydarzyć w określonym czasie. Np. gdyby procek sterował  drukarką 3d to nie możesz nie ruszyć silnikiem w określonym czasie bo plastik kapie ze stałą prędkością, nie ruszysz to zrobi kleksa. Jeśli potrzebujesz przerwań wchodzisz w Arduino Reference i wszystko jest  opisane. Nie można korzystać  z ogólnej wiedzy o C/C++/AVR bo część elementów jest używane do napędzania timerów programowych Arduino - nimi "żywią" się np. funkcje millis() i micros(), a te używane są w bibliotekach. Sprawdź też sobie ile coś trwa: 
Kod:
uint32_t czas1=micros();
 display.display();   // clears the screen and buffer
 czas1=micros()-czas1;
W zależności jak masz taktowany SPI tak długo trwa przesyłanie danych. Generalnie jest szybciej niż na oled I2C jakieś 3-10x, więc sam musisz ocenić, czy 1-3ms ma dla Ciebie znaczenie czy nie. Są też inne biblioteki, inne podejście, też można tak jak w moim wcześniejszym przykładzie odświeżyć część ekranu, to nie jest matryca led wymagająca odświeżania co 5ms. 
Dyskusja jest kwintesencją forum, bez tego nic byśmy się tu nie uczyli...

Jak Pan es2 zainstalował już Arduino to proszę wgrać ten przykład:
Kod:
/*
 Blink without Delay

 Turns on and off a light emitting diode (LED) connected to a digital pin,
 without using the delay() function. This means that other code can run at the
 same time without being interrupted by the LED code.

 The circuit:
 - Use the onboard LED.
 - Note: Most Arduinos have an on-board LED you can control. On the UNO, MEGA
   and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN
   is set to the correct LED pin independent of which board is used.
   If you want to know what pin the on-board LED is connected to on your
   Arduino model, check the Technical Specs of your board at:
   https://www.arduino.cc/en/Main/Products

 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 modified 11 Nov 2013
 by Scott Fitzgerald
 modified 9 Jan 2017
 by Arturo Guadalupi

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

// constants won't change. Used here to set a pin number:
const int ledPin =  LED_BUILTIN;// the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
 // set the digital pin as output:
 pinMode(ledPin, OUTPUT);
}

void loop() {
 // here is where you'd put code that needs to be running all the time.

 // check to see if it's time to blink the LED; that is, if the difference
 // between the current time and last time you blinked the LED is bigger than
 // the interval at which you want to blink the LED.
 unsigned long currentMillis = millis();

 if ((unsigned long)(currentMillis - previousMillis) >= interval) {
   // save the last time you blinked the LED
   previousMillis = currentMillis;

   // if the LED is off turn it on and vice-versa:
   if (ledState == LOW) {
     ledState = HIGH;
   } else {
     ledState = LOW;
   }

   // set the LED with the ledState of the variable:
   digitalWrite(ledPin, ledState);
 }
}
i dać znać gdy objawi się ta pluskwa millis(). Proszę zresztą się nie przejmować, w zabawkach to nie ma znaczenia. Cały kod do oleda jest w poście wraz z bibliotekami, nie mam pojęcia jak działa biblioteka.
Miło być decenianym https://buycoffee.to/kaczakat
 
#19
(16-04-2018, 17:50)kaczakat napisał(a): Jak Pan es2 zainstalował już Arduino to proszę wgrać ten przykład:
Zainstalowałem ale nie wiem jak wgrać.
[Obrazek: IMG_5ad46db6e81a64720.jpg]
 
#20
Serio? A ja tak liczyłem na te biblioteki w asemblerze do DS18b20 z transmisją przez przerwania UART...
Na tej samej stronie skąd jest ta fotka jest tutorial: https://forbot.pl/blog/kurs-arduino-srod...owac-id936 .
Miło być decenianym https://buycoffee.to/kaczakat
 
  


Skocz do:


Przeglądający: 1 gości