Related
I recently tried to make a menu on 128x64 oled display I2C and arduino uno so I found this really good tutorial(https://youtu.be/HVHVkKt-ldc). I wrote code to make menu scroll using joystick than I added a little game, uploaded code to my arduino and it worked well. I played that game on arduino and after three days display started randomly freezing only way to fix that eas to reset the arduino but when i played game it never freezed, display was only freezing when I was scrolling through the menu. By the way I was using u8glib. If you have any questions I'll respond as quickly as possible. Please hel me to solve this problem.
I tried everything: I rewrote logic, I replaced joystick with buttons, I uploaded different programs i just don't know what to do.
here is my code, sorry that it is messy.
#include <U8glib.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI
const int NUM_ITEMS = 5;
// 'icon 1', 16x16px
const unsigned char epd_bitmap_icon_1 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x77, 0x77,
0x7f, 0xff, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'icon 2', 16x16px
const unsigned char epd_bitmap_icon_2 [] PROGMEM = {
0x00, 0x00, 0x01, 0x80, 0x02, 0x40, 0x02, 0xc0, 0x02, 0x40, 0x02, 0xc0, 0x02, 0x40, 0x02, 0xc0,
0x02, 0x40, 0x02, 0xc0, 0x02, 0x40, 0x04, 0x20, 0x06, 0x20, 0x07, 0xe0, 0x03, 0xc0, 0x00, 0x00
};
// 'icon 3', 16x16px
const unsigned char epd_bitmap_icon_3 [] PROGMEM = {
0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x11, 0x00, 0x01, 0x0a, 0x01, 0x04, 0x01, 0x0a, 0x01, 0x00,
0x01, 0xf8, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char epd_bitmap_icon_4 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06,
0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char epd_bitmap_icon_5 [] PROGMEM = {
0x1f, 0xf8, 0x1f, 0xf8, 0x10, 0x08, 0x10, 0x08, 0x13, 0xc8, 0x09, 0x90, 0x04, 0x20, 0x02, 0x40,
0x02, 0x40, 0x05, 0xa0, 0x08, 0x10, 0x11, 0x88, 0x11, 0xc8, 0x13, 0xc8, 0x1f, 0xf8, 0x1f, 0xf8
};
const unsigned char epd_bitmap_frame [] PROGMEM = {
0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0
};
// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 144)
void setup(void) {
u8g.setColorIndex(1);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(13, INPUT_PULLUP);
Serial.begin(9600);
}
const unsigned char* icons[NUM_ITEMS] = {
epd_bitmap_icon_1,
epd_bitmap_icon_2,
epd_bitmap_icon_3,
epd_bitmap_icon_4,
epd_bitmap_icon_5
};
char menu_items [NUM_ITEMS] [20] = {
{"Distance meter"},
{"Thermometer"},
{"Gyro"},
{"Game"},
{"Timer"}
};
int previous_it;
int selected_it = 0;
int next_it;
int xStick;
int yStick;
unsigned long sec;
char location = "menu";
byte btnC = 0;
boolean btn;
int x_cir = 32;
int y_cir = 64;
void stickValues(){
xStick = analogRead(A0);
yStick = analogRead(A1);
yStick = map(yStick, 0, 1023, -1, 6);
constrain(yStick, -1, 6);
xStick = map(xStick, 0, 1023, -1, 6);
constrain(xStick, -1, 6);
btn = !digitalRead(13);
}
void circle(){
u8g.drawLine(20, 32, 30, 32);
u8g.drawLine(59, 10, 69, 10);
u8g.drawLine(98, 32, 108, 32);
u8g.drawCircle(y_cir, x_cir, 4);
}
void game(){
stickValues();
if (millis() - sec > 50){
if(yStick < 2 && y_cir < 128){
y_cir += 4;
}
if(yStick > 4 && y_cir > 0){
y_cir -= 4;
}
if(xStick < 2 && x_cir > 0){
x_cir -= 4;
}
if(xStick > 4 && x_cir < 64){
x_cir += 4;
}
sec = millis();
}
}
void loop(void){
// logic to select item
stickValues();
if(btnC != 1){
if(xStick < 2 && millis() - sec > 200){
selected_it += 1;
if(selected_it == 4){selected_it = 0;}
sec = millis();
}
if(xStick > 4 && millis() - sec > 200){
selected_it -= 1;
if(selected_it == -1){selected_it = 4;}
sec = millis();
}
}
previous_it = (selected_it - 1);
if (previous_it < 0) {previous_it = 4;} // previous item would be below first = make it the last
next_it = (selected_it + 1);
if (next_it > 4) {next_it = 0;}
// end
// actions to begin the game
if(selected_it == 3 && btnC == 1){
if (millis() - sec > 50){
if(btn == 1){
btnC++;
if(btnC > 1){btnC = 0;}
}
game();
sec = millis();
}
}
// end
//serial things
// Serial.print("btn ");
// Serial.print(btn);
// Serial.print(" btnC ");
// Serial.print(btnC);
// Serial.print(" yStick ");
// Serial.print(yStick);
// Serial.print(" xStick ");
// Serial.print(xStick);
// Serial.print(" selected_it ");
// Serial.print(selected_it);
// Serial.print(" next_it ");
// Serial.println(next_it);
// button counter
if(btn == 1){
btnC++;
if(btnC > 1){btnC = 0;}
}
//end
u8g.firstPage();
do {
// game begin
if(selected_it == 3 && btnC == 1){circle();}
//
// menu begin
if(btnC == 0 ){
//previos item
u8g.setFont(u8g_font_7x14);
u8g.drawStr(26, 15, menu_items[previous_it]);
u8g.drawBitmapP( 4, 2, 16/8, 16, icons[previous_it]);
//selected item
u8g.setFont(u8g_font_7x14B);
u8g.drawStr(26, 37, menu_items[selected_it]);
u8g.drawBitmapP( 4, 24, 16/8, 16, icons[selected_it]);
//next item
u8g.setFont(u8g_font_7x14);
u8g.drawStr(26, 59, menu_items[next_it]);
u8g.drawBitmapP( 4, 46, 16/8, 16, icons[next_it]);
u8g.drawBitmapP( 0, 22, 128/8, 20, epd_bitmap_frame);
}
// menu end
} while( u8g.nextPage() );
}
I need some help with CRC calculation. I spent a week trying to understand how a CRC (or Checksum) is calculated on a communication protocol
I have a Endress+Hauser pH probe (CPS11D-7FA21) that has MemoSense connector. Basically it is a digital pH probe. The communication is RS485 but the protocol is proprietary, so no info on that.
I connected the probe to a meter and sniffed the frames. There is a lot of data going back and fourth in the beginning but the polling repeats.
I was able to write some code for an Arduino and it worked, I can initialize the probe and pool measurements (ph(mV) and temperature), but the problem is that it only work with one probe. If I connect a new one it all stops.
I was digging a bit and I found out that right before the pooling starts the Init frame is different... Ii seem the measuring device somehow calculates the Init data from some other data that is exchanged in the beginning.
Anyway the fist thing is that I want to understand how the data frame is constructed.
Here is an example of pooling one of the probes and the data changes slightly
0x01, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x04, 0x03, 0x09, 0x00, 0x20, 0xb9
0x01, 0x01, 0x00, 0x00, 0x00, 0x2f, 0x04, 0x03, 0x09, 0x00, 0x21, 0x99
0x01, 0x01, 0x00, 0x00, 0x00, 0x30, 0x04, 0x03, 0x09, 0x00, 0x3e, 0x7a
0x01, 0x01, 0x00, 0x00, 0x00, 0x32, 0x04, 0x03, 0x09, 0x00, 0x3c, 0x3a
0x01, 0x01, 0x00, 0x00, 0x00, 0x33, 0x04, 0x03, 0x09, 0x00, 0x3d, 0x1a
| <-------------------> | \ / \ / | | |
Header pH(mV)/10 Temp/100 ? Csum CRC???
0x01, 0x01, 0x00, 0x00, 0x00, 0x8d, 0x06, 0xf4, 0x08, 0x00, 0x77, 0x56
0x01, 0x01, 0x00, 0x00, 0x00, 0x8f, 0x06, 0xf4, 0x08, 0x00, 0x75, 0x16
0x01, 0x01, 0x00, 0x00, 0x00, 0x88, 0x06, 0xf4, 0x08, 0x00, 0x72, 0xf6
0x01, 0x01, 0x00, 0x00, 0x00, 0x94, 0x06, 0xf5, 0x08, 0x00, 0x6f, 0x7d
0x01, 0x09, 0x04, 0x00, 0x0c, 0x00, 0x14, 0x02, 0x03, 0x11, 0x36, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x20, 0x20, 0x20, 0x46, 0x57
0x01, 0x09, 0x04, 0x00, 0x0c, 0x00, 0x15, 0x07, 0x17, 0x12, 0x26, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x20, 0x20, 0x20, 0x45, 0xb0
0x01, 0x00, 0x04, 0x00, 0x05, 0xa8, 0x4b, 0x53, 0x47, 0x31, 0x20, 0x01, 0x01, 0x01, 0x5a, 0x02, 0x9f, 0x27, 0x40, 0x39, 0x3f, 0x04, 0x52, 0x31, 0x32, 0x38, 0x44, 0x46, 0x30, 0x35, 0x42, 0x30, 0x33, 0x14, 0x01, 0x16, 0x00, 0x69, 0x00
0x01, 0x00, 0x04, 0x00, 0x05, 0xa8, 0x4b, 0x53, 0x47, 0x31, 0x20, 0x01, 0x01, 0x01, 0x01, 0x00, 0x75, 0x27, 0x41, 0xb8, 0x41, 0x04, 0x53, 0x36, 0x33, 0x37, 0x45, 0x44, 0x30, 0x35, 0x42, 0x30, 0x37, 0x15, 0x07, 0x06, 0x00, 0x3c, 0xf3
0x01, 0x08, 0x04, 0x00, 0x0d, 0xb0, 0xe5, 0x69, 0x1b, 0x00, 0x00, 0x69, 0x1b, 0x15, 0x07, 0x17, 0x12, 0x26, 0x02, 0x44, 0x1b, 0xaa, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x20, 0x20, 0x20, 0xe9, 0xcd
0x01, 0x08, 0x04, 0x00, 0x0d, 0x40, 0xe7, 0x58, 0x1b, 0x00, 0x00, 0x67, 0x1b, 0x14, 0x02, 0x03, 0x11, 0x36, 0x02, 0x44, 0x1b, 0xaa, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x20, 0x20, 0x20, 0x27, 0xde
Here is what I learned so far, the Csum is a standard 8bit Xor checksum
that works here
https://www.scadacore.com/tools/programming-calculators/online-checksum-calculator/
But the CRC is a mystery for me ... I tried multiple calculator and different data pieces and nothing. To me it seems it is a CRC because the if one bit changes there is a huge difference in the CRC byte
Maybe someone here could shed some light on this
Thank you
The last byte appears to be an exclusive-or and rotate check on the non-header bytes. If the message with check values is the unsigned char array a[0..len-1], then this computes the last two check values, x == a[len - 2] and y == a[len - 1]:
unsigned x = 0, y = 0;
for (size_t i = 0; i < len - 2; i++)
x ^= a[i];
for (size_t i = 5; i < len - 2; i++) {
y = (y ^ a[i]) << 1;
if (y & 0x100)
y ^= 0x101;
}
I am a beginner to programming
I am trying to program an ESP32 to show Bitcoin and Cardano price on an Adafruit SSD1306
128x64 OLED display based on the youtube video https://youtu.be/1Xas_UCOMvQ,
I want to show more than one crypto currency (bitcoin and cardano) but couldn't find a code for that so tried to do it myself by combining two codes from two guys (sources are mentioned below),
when I tried to run it is showing bitcoin price but for cardano it is showing "null".
Can you tell me why it is not showing cardano price?
code is given below
//Bitcoin and Cardano Ticker
//Modified with codes from Michael Klements original version "https://www.the-diy-life.com/bitcoin-ticker-using-an-esp32-and-oled-display/"
("https://youtu.be/1Xas_UCOMvQ")and Vincent Rubens "https://github.com/xreactx/CryptoTicker/blob/main/CryptoTickerADA.ino"
//to include the Bitcoin logo and IO for the red and green indicator LEDs
#include <Adafruit_SSD1306.h> //Include the required libraries
#include <WiFi.h>
#include <Wire.h>
#include <HTTPClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
#define SCREEN_WIDTH 128 //Define the OLED display width and height
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C //I2C address for display
#define upLED 13
#define downLED 12
Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Create the display object
const char* ssid = "Your wifi name"; //Set your WiFi network name and password
const char* password = "your wifi password";
const int httpsPort = 443; //Bitcoin price API powered by CoinDesk - https://www.coindesk.com/price/bitcoin
const String url = "http://api.coindesk.com/v1/bpi/currentprice/BTC.json";
const String historyURL = "http://api.coindesk.com/v1/bpi/historical/close.json";
const String cryptoCode = "BTC";
const String url1 = "https://api.coingecko.com/api/v3/simple/price?ids=cardano&vs_currencies=usd&include_24hr_change=true";
//Cardano price API powered by CoinDesk - https://www.coingecko.com/
WiFiClient client; //Create a new WiFi client
HTTPClient http;
String formattedDate; //Create variables to store the date and time
String dayStamp;
String timeStamp;
const unsigned char bitcoinLogo [] PROGMEM = // 'Bitcoin Logo', 128x64px
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x03, 0xe7, 0xc0, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xe7, 0xc0, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x02, 0x24, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x24, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x02, 0x24, 0x40, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x24, 0x40, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x02, 0x3c, 0x40, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xfe, 0x3c, 0x7c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x1f, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1c, 0x03, 0xf0, 0x3f, 0x80, 0x60, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xf0, 0x3f, 0xe0, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x30, 0x70, 0x30, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x30, 0x10, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x30, 0x10, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x30, 0x10, 0x30, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x30, 0x30, 0x20, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x30, 0xe0, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x3f, 0xc0, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x01, 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x00, 0xf0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x3f, 0xe0, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x30, 0xf8, 0x0c, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x30, 0x1c, 0x0c, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x30, 0x0c, 0x0c, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x30, 0x04, 0x0c, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x30, 0x0c, 0x0c, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x30, 0x0c, 0x0c, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x30, 0x38, 0x0c, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0xf0, 0x3f, 0xf0, 0x08, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0, 0x1f, 0x00, 0x18, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xfe, 0x3c, 0x7e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x02, 0x3c, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x24, 0x40, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x02, 0x24, 0x40, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x24, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x02, 0x24, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xe7, 0xc0, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x03, 0xe7, 0xc0, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup()
{
Serial.begin(115200); //Start the serial monitor
pinMode(upLED, OUTPUT); //Define the LED pin outputs
pinMode(downLED, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) //Connect to the display
{
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display.clearDisplay(); //Clear the display
display.setTextColor(SSD1306_WHITE); //Set the text colour to white
display.drawBitmap(0, 0, bitcoinLogo, 128, 64, WHITE); //Display bitmap from array
display.display();
delay(2000);
display.clearDisplay(); //Clear the display
display.setTextSize(1); //Set display parameters
display.setTextColor(WHITE);
display.println("Connecting to WiFi...");
display.display();
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) //Connect to the WiFi network
{
delay(500);
Serial.print(".");
}
Serial.println();
display.println("Connected to: "); //Display message once connected
display.print(ssid);
display.display();
delay(1500);
display.clearDisplay();
display.display();
}
void loop()
{
Serial.print("Connecting to "); //Display url on Serial monitor for debugging
Serial.println(url);
http.begin(url);
int httpCode = http.GET(); //Get crypto price from API
StaticJsonDocument<2000> doc;
DeserializationError error = deserializeJson(doc, http.getString());
if (error) //Display error message if unsuccessful
{
Serial.print(F("deserializeJson Failed"));
Serial.println(error.f_str());
delay(2500);
return;
}
Serial.print("HTTP Status Code: ");
Serial.println(httpCode);
String BTCUSDPrice = doc["bpi"]["USD"]["rate_float"].as<String>(); //Store crypto price and update date in local variables
String lastUpdated = doc["time"]["updated"].as<String>();
http.end();
Serial.print("Getting history...");
StaticJsonDocument<2000> historyDoc;
http.begin(historyURL); //Get historical crypto price from API
int historyHttpCode = http.GET();
DeserializationError historyError = deserializeJson(historyDoc, http.getString());
if (historyError) { //Display error message if unsuccessful
Serial.print(F("deserializeJson(History) failed"));
Serial.println(historyError.f_str());
delay(2500);
return;
}
Serial.print("History HTTP Status Code: ");
Serial.println(historyHttpCode);
JsonObject bpi = historyDoc["bpi"].as<JsonObject>();
double yesterdayPrice;
for (JsonPair kv : bpi) {
yesterdayPrice = kv.value().as<double>(); //Store yesterday's crypto price
}
Serial.print("BTCUSD Price: "); //Display current price on serial monitor
Serial.println(BTCUSDPrice.toDouble());
Serial.print("Yesterday's Price: "); //Display yesterday's price on serial monitor
Serial.println(yesterdayPrice);
bool isUp = BTCUSDPrice.toDouble() > yesterdayPrice; //Check whether price has increased or decreased
double percentChange;
String dayChangeString = "24hr. Change: ";
if (isUp) //If price has increased from yesterday
{
percentChange = ((BTCUSDPrice.toDouble() - yesterdayPrice) / yesterdayPrice) * 100;
digitalWrite(upLED, HIGH);
digitalWrite(downLED, LOW);
}
else //If price has decreased from yesterday
{
percentChange = ((yesterdayPrice - BTCUSDPrice.toDouble()) / yesterdayPrice) * 100;
dayChangeString = dayChangeString + "-";
digitalWrite(downLED, HIGH);
digitalWrite(upLED, LOW);
}
Serial.print("Percent Change: "); //Display the percentage change on the serial monitor
Serial.println(percentChange);
display.clearDisplay(); //Clear the OLED display
display.setTextSize(1);
printCenter("BTC/USD", 0, 0); //Display the comparison header
display.setTextSize(2);
printCenter("$" + BTCUSDPrice, 0, 25); //Display the current price
display.setTextSize(1); //Display the change percentage
dayChangeString = dayChangeString + percentChange + "%";
printCenter(dayChangeString, 0, 55);
display.display(); //Execute the new display
display.clearDisplay();
delay(5000); //Execute the new display
Serial.print("Connecting to "); //Display url11 on Serial monitor for debugging
Serial.println(url1);
http.begin(url1);
int httpCode1 = http.GET(); //Get crypto price from API
StaticJsonDocument<2000> doc1;
DeserializationError error1 = deserializeJson(doc, http.getString());
if (error) //Display error message if unsuccessful
{
Serial.print(F("deserializeJson Failed"));
Serial.println(error1.f_str());
delay(2500);
return;
}
Serial.print("HTTP Status Code: ");
Serial.println(httpCode1);
//Get crypto price from API
String ADAUSDPrice = doc1["cardano"]["usd"].as<String>(); //Store crypto price and update date in local variables
String percentChange1 = doc1["cardano"]["usd_24h_change"].as<String>();
percentChange1.remove(4); //Adjust the decimal placement
http.end();
Serial.print("ADAUSD Price: "); //Display current price on serial monitor
bool isup1 = percentChange1 > "0"; //Check whether price has increased or decreased
String dayChange1String = "24hr. Change: ";
if (isup1) //If price has increased from yesterday
{
percentChange1 >= "0";
digitalWrite(upLED, HIGH);
digitalWrite(downLED, LOW);
}
else //If price has decreased from yesterday
{
percentChange1 < "0";
digitalWrite(downLED, HIGH);
digitalWrite(upLED, LOW);
}
Serial.print("Percent Change: "); //Display the percentage change on the serial monitor
Serial.println(percentChange1);
display.clearDisplay(); //Clear the OLED display
display.setTextSize(1);
printCenter("ADA/USD", 0, 0); //Display the comparison header
display.setTextSize(2);
printCenter("$" + ADAUSDPrice, 0, 20); //Display the current price
display.setTextSize(1); //Display the change percentage
dayChange1String = dayChange1String + percentChange1 + "%";
printCenter(dayChange1String, 0, 55);
display.display(); //Execute the new display
display.clearDisplay();
delay(5000);
http.end(); //End the WiFi connection
esp_sleep_enable_timer_wakeup(900000000); //Sleep for 15 minutes
}
void printCenter(const String buf, int x, int y) //Function to centre the current price in the display width
{
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds(buf, x, y, &x1, &y1, &w, &h); //Calculate string width
display.setCursor((x - w / 2) + (128 / 2), y); //Set cursor to print string in centre
display.print(buf); //Display string
}
images are given below
displaying "null" for cardano
for bitcoin its showing prices
The error in the code is that you are parsing the wrong document, for the ADA case. You are parsing the BTC doc instead of the ADA doc. In the following line, you should pass doc1 as parameter, but you are passing the document that was received from the BTC url, doc.
Change
DeserializationError error1 = deserializeJson(doc, http.getString());
to
DeserializationError error1 = deserializeJson(doc1, http.getString());
Trying to implement a custom geometry for QtQuick3D:
mycustomgeometry.h:
#ifndef MYCUSTOMGEOMETRY_H
#define MYCUSTOMGEOMETRY_H
#include <QQuick3DGeometry>
class MyCustomGeometry : public QQuick3DGeometry
{
Q_OBJECT
public:
MyCustomGeometry();
virtual ~MyCustomGeometry();
signals:
public slots:
void setData(QByteArray vertexData, QByteArray indexData);
};
#endif // MYCUSTOMGEOMETRY_H
mycustomgeometry.cpp:
#include "mycustomgeometry.h"
#include <QVector3D>
// simulate data coming from my application (should look like a cut cuboid)
static unsigned char vertexData[] = {
0x00, 0x00, 0xe0, 0xb3, 0x8c, 0xca, 0x4c, 0xbd, 0x1c, 0x63, 0x89, 0x3d,
0x00, 0x00, 0x60, 0x35, 0x0c, 0xcf, 0x4c, 0x3d, 0xa4, 0x61, 0x89, 0x3d,
0x64, 0x2e, 0x37, 0xbd, 0xb8, 0xcc, 0x4c, 0xbd, 0x00, 0x2a, 0xb7, 0xbc,
0x68, 0x2d, 0x37, 0xbd, 0xe4, 0xcc, 0x4c, 0x3d, 0xe0, 0x2f, 0xb7, 0xbc,
0x80, 0x2d, 0x37, 0x3d, 0xa4, 0xcb, 0x4c, 0xbd, 0x18, 0x2f, 0x37, 0x3d,
0x80, 0x2e, 0x37, 0x3d, 0xf0, 0xcd, 0x4c, 0x3d, 0x28, 0x2c, 0x37, 0x3d,
0xd8, 0x2c, 0x37, 0x3d, 0xf8, 0xce, 0x4c, 0xbd, 0xa0, 0x61, 0x89, 0xbd,
0xd8, 0x2d, 0x37, 0x3d, 0xa4, 0xca, 0x4c, 0x3d, 0x20, 0x63, 0x89, 0xbd
};
static unsigned char indexData[] = {
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
};
MyCustomGeometry::MyCustomGeometry()
{
QByteArray v(reinterpret_cast<char*>(::vertexData), sizeof(::vertexData));
QByteArray i(reinterpret_cast<char*>(::indexData), sizeof(::indexData));
setData(v, i);
}
MyCustomGeometry::~MyCustomGeometry()
{
}
void MyCustomGeometry::setData(QByteArray vertexData, QByteArray indexData)
{
clear();
setPrimitiveType(PrimitiveType::Triangles);
addAttribute(Attribute::PositionSemantic, 0, Attribute::F32Type);
addAttribute(Attribute::IndexSemantic, 0, Attribute::U32Type);
addAttribute(Attribute::NormalSemantic, 0, Attribute::F32Type);
setVertexData(vertexData);
setIndexData(indexData);
setStride(sizeof(float) * 3);
QVector3D boundsMin, boundsMax;
auto vertices = reinterpret_cast<const float*>(vertexData.constData());
for(size_t i = 0; i < vertexData.length() / sizeof(float); i += 3)
{
for(size_t j = 0; j < 3; j++)
{
boundsMin[j] = (std::min(vertices[i + j], i == 0 ? vertices[i + j] : boundsMin[j]));
boundsMax[j] = (std::max(vertices[i + j], i == 0 ? vertices[i + j] : boundsMax[j]));
}
}
setBounds(boundsMin, boundsMax);
}
main.qml:
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15
import QtQuick3D.Helpers 1.15
import QtQuick.Controls 2.15
import MyCustomGeometry 1.0
Window {
id: mainWindow
width: 400
height: 300
visible: true
flags: Qt.Tool
title: qsTr("3D demo")
View3D {
id: view
anchors.fill: parent
camera: camera
renderMode: View3D.Overlay
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 200, 300)
eulerRotation.x: -30
}
WasdController {
controlledObject: camera
mouseEnabled: true
}
DirectionalLight {
eulerRotation.x: -30
}
Model {
id: cube
objectName: "cube"
visible: true
position: Qt.vector3d(-100, 0, 0)
scale: Qt.vector3d(slider.k, slider.k, slider.k)
source: "#Cube"
materials: [DefaultMaterial {diffuseColor: "red"}]
eulerRotation.y: 90
}
Model {
id: sphere
objectName: "sphere"
visible: true
position: Qt.vector3d(100, 0, 0)
scale: Qt.vector3d(slider.k, slider.k, slider.k)
//source: "#Sphere"
geometry: MyCustomGeometry {}
materials: [DefaultMaterial {diffuseColor: "blue"}]
eulerRotation.y: 90
}
}
Slider {
id: slider
property real k: Math.pow(10, slider.value)
from: -3; to: 6; value: 3
}
}
The cube, and the sphere (when commenting geometry: and uncommenting source:) display correctly.
But the model with the custom geometry does not.
I tried also with 16-bit integers as indices, but got the same result.
Edit: tested on Qt 6.0.0 and it works, so it is a problem limited to Qt 5.15.2
It works on Qt 5 too if setting the name property, as per QTBUG-89420:
MyCustomGeometry::MyCustomGeometry()
{
QByteArray v(reinterpret_cast<char*>(::vertexData), sizeof(::vertexData));
QByteArray i(reinterpret_cast<char*>(::indexData), sizeof(::indexData));
setData(v, i);
setName("MyCustomGeometry");
}
I am using a Arduino UNO with a c-control programmable graphic display.
I used the documentation of Franzis Maker Kit Grafikdisplays programmieren TURN ON YOUR CREATIVITY .
Display: DXDCG12864-4330 Displaycontroller: ST7564
My code is:
#include "TextDisplay.h"
int i=1;
TextDisplay display = TextDisplay();
void setup() {
display.init(25);
}
void loop() {
char buffer[40];
display.clear();
display.println("ABCD");
sprintf(buffer, " Dw2: %05d", i);
display.println(buffer);
delay(2000);
i++;
}
The problem is that the lines get printed beneath each other and that the display.clear() doesn't clean the display. The display shows after 2 loops:
ABCD
Dw2: 1
ABCD
Dw2: 2
instant of :
ABCD
Dw2: 2
TextDisplay.h:
#ifndef _TEXTDISPLAY_H_
#define _TEXTDISPLAY_H_
#include "Display.h"
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class TextDisplay {
public:
TextDisplay() {};
void init(byte contrast);
void println(const char* string);
void print(const char string);
void clear(void);
byte getLastCharPosition(byte line);
void writeTextBuffer();
private:
Display lcd;
byte textBuffer[8][22];
byte curserPositionY, curserPositionX;
};
#endif
TextDisplay.cpp:
#include "TextDisplay.h"
#include "Display.h"
#include "Font.h"
void TextDisplay::init(byte contrast) {
lcd = Display();
lcd.init(contrast);
lcd.clearDisplayRAM();
lcd.setPageAddress(0);
lcd.setColumnAddress(0);
curserPositionY = 0;
curserPositionX = 0;
textBuffer[MAX_CHARACTERS_Y][MAX_CHARACTERS_X];
}
void TextDisplay::println(const char* string) {
int position = 0;
while (string[position]) {
char character = string[position];
print(character);
string++;
}
print(13);
}
void TextDisplay::clear(void) {
print(255);
}
void TextDisplay::print(char character) {
switch (character) {
case 255:
for (byte y=0; y<MAX_CHARACTERS_Y; y++) {
for (byte x=0; x<MAX_CHARACTERS_X; x++) {
textBuffer[y][x] = 0;
}
}
writeTextBuffer();
curserPositionY = 0;
curserPositionX = 0;
break;
case 127: //Delete (Putty Backspace)
if (curserPositionX == 0 && curserPositionY > 0) {
curserPositionY--;
curserPositionX = getLastCharPosition(curserPositionY);
textBuffer[curserPositionY][curserPositionX] = 0;
}
else if (curserPositionX > 0) {
curserPositionX--;
textBuffer[curserPositionY][curserPositionX] = 0;
}
else {
}
break;
case 13: //CR
if (curserPositionY < MAX_CHARACTERS_Y-1) {
curserPositionY++;
curserPositionX = 0;
}
break;
default:
if (curserPositionX < MAX_CHARACTERS_X) {
textBuffer[curserPositionY][curserPositionX] = character;
curserPositionX++;
}
else if (curserPositionY < MAX_CHARACTERS_Y-1) {
curserPositionY++;
curserPositionX = 0;
textBuffer[curserPositionY][curserPositionX] = character;
curserPositionX++;
}
break;
}
writeTextBuffer();
}
byte TextDisplay::getLastCharPosition(byte line) {
for (byte x=0; x<MAX_CHARACTERS_X; x++) {
if(textBuffer[line][x] == 0) {
return (x!=0) ? x : 0;
}
}
return MAX_CHARACTERS_X-1;
}
void TextDisplay::writeTextBuffer() {
for (byte y=0; y<MAX_CHARACTERS_Y; y++) {
lcd.setPageAddress(y);
lcd.setColumnAddress(0);
for (byte x=0; x<MAX_CHARACTERS_X; x++) {
int position = textBuffer[y][x] * CHARACTER_WIDTH;
for (byte i=0; i<CHARACTER_WIDTH; i++) {
lcd.writeData(pgm_read_byte(font7x5 + position++));
}
}
}
}
Font.h:
#define CHARACTER_WIDTH 6
#define MAX_CHARACTERS_X 22
#define MAX_CHARACTERS_Y 8
const PROGMEM byte font7x5[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char NULL
0x3E, 0x55, 0x51, 0x55, 0x3E, 0x00, // Code for char
0x3E, 0x6B, 0x6F, 0x6B, 0x3E, 0x00, // Code for char
0x0E, 0x1F, 0x3E, 0x1F, 0x0E, 0x00, // Code for char
0x08, 0x1C, 0x3E, 0x1C, 0x08, 0x00, // Code for char
0x98, 0x9B, 0xFF, 0x9B, 0x98, 0x00, // Code for char
0x18, 0x5E, 0x7F, 0x5E, 0x18, 0x00, // Code for char
0x00, 0x08, 0x1C, 0x08, 0x00, 0x00, // Code for char
0x7F, 0x77, 0x63, 0x77, 0x7F, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x30, 0x48, 0x48, 0x3E, 0x07, 0x00, // Code for char
0x06, 0x29, 0x79, 0x29, 0x06, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x60, 0x7E, 0x06, 0x33, 0x3F, 0x00, // Code for char
0x49, 0x3E, 0x63, 0x3E, 0x49, 0x00, // Code for char
0x08, 0x08, 0x7F, 0x08, 0x08, 0x00, // Code for char
0x08, 0x1C, 0x3E, 0x7F, 0x00, 0x00, // Code for char
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, // Code for char
0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, // Code for char
0x06, 0x0F, 0x7F, 0x00, 0x7F, 0x00, // Code for char
0x08, 0x08, 0x0F, 0x08, 0x08, 0x00, // Code for char
0x08, 0x08, 0x78, 0x08, 0x08, 0x00, // Code for char
0x00, 0x08, 0x08, 0x7F, 0x00, 0x00, // Code for char
0x04, 0x02, 0x7F, 0x02, 0x04, 0x00, // Code for char
0x00, 0x7F, 0x08, 0x08, 0x00, 0x00, // Code for char
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, // Code for char
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, // Code for char !
0x00, 0x03, 0x00, 0x03, 0x00, 0x00, // Code for char "
0x74, 0x1C, 0x77, 0x1C, 0x17, 0x00, // Code for char #
0x24, 0x4A, 0xFF, 0x52, 0x24, 0x00, // Code for char $
0x43, 0x33, 0x08, 0x66, 0x61, 0x00, // Code for char %
0x36, 0x49, 0x55, 0x22, 0x50, 0x00, // Code for char &
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // Code for char '
0x00, 0x00, 0x3E, 0x41, 0x00, 0x00, // Code for char (
0x00, 0x00, 0x41, 0x3E, 0x00, 0x00, // Code for char )
0x00, 0x0A, 0x04, 0x0A, 0x00, 0x00, // Code for char *
0x00, 0x08, 0x1C, 0x08, 0x00, 0x00, // Code for char +
0x00, 0x00, 0xA0, 0x60, 0x00, 0x00, // Code for char ,
0x00, 0x08, 0x08, 0x08, 0x00, 0x00, // Code for char -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // Code for char .
0x00, 0x60, 0x1C, 0x03, 0x00, 0x00, // Code for char /
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, // Code for char 0
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, // Code for char 1
0x42, 0x61, 0x51, 0x49, 0x46, 0x00, // Code for char 2
0x22, 0x41, 0x49, 0x49, 0x36, 0x00, // Code for char 3
0x1C, 0x13, 0x10, 0x78, 0x10, 0x00, // Code for char 4
0x4F, 0x49, 0x49, 0x49, 0x31, 0x00, // Code for char 5
0x3E, 0x49, 0x49, 0x49, 0x32, 0x00, // Code for char 6
0x01, 0x01, 0x71, 0x09, 0x07, 0x00, // Code for char 7
0x36, 0x49, 0x49, 0x49, 0x36, 0x00, // Code for char 8
0x26, 0x49, 0x49, 0x49, 0x3E, 0x00, // Code for char 9
0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00, // Code for char :
0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00, // Code for char ;
0x00, 0x08, 0x14, 0x22, 0x00, 0x00, // Code for char <
0x00, 0x14, 0x14, 0x14, 0x00, 0x00, // Code for char =
0x00, 0x22, 0x14, 0x08, 0x00, 0x00, // Code for char >
0x02, 0x01, 0x51, 0x09, 0x06, 0x00, // Code for char ?
0x3E, 0x5D, 0x5D, 0x51, 0x5E, 0x00, // Code for char #
0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, // Code for char A
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, // Code for char B
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, // Code for char C
0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, // Code for char D
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, // Code for char E
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, // Code for char F
0x3E, 0x41, 0x41, 0x51, 0x32, 0x00, // Code for char G
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, // Code for char H
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, // Code for char I
0x00, 0x20, 0x40, 0x3F, 0x00, 0x00, // Code for char J
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, // Code for char K
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, // Code for char L
0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, // Code for char M
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, // Code for char N
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, // Code for char O
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, // Code for char P
0x3E, 0x41, 0x41, 0x21, 0x5E, 0x00, // Code for char Q
0x7F, 0x09, 0x09, 0x09, 0x76, 0x00, // Code for char R
0x26, 0x49, 0x49, 0x49, 0x32, 0x00, // Code for char S
0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, // Code for char T
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, // Code for char U
0x03, 0x1C, 0x60, 0x1C, 0x03, 0x00, // Code for char V
0x1F, 0x60, 0x18, 0x60, 0x1F, 0x00, // Code for char W
0x63, 0x14, 0x08, 0x14, 0x63, 0x00, // Code for char X
0x03, 0x04, 0x78, 0x04, 0x03, 0x00, // Code for char Y
0x61, 0x51, 0x49, 0x45, 0x43, 0x00, // Code for char Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // Code for char [
0x00, 0x03, 0x1C, 0x60, 0x00, 0x00, // Code for char BackSlash
0x00, 0x41, 0x41, 0x7F, 0x00, 0x00, // Code for char ]
0x00, 0x06, 0x01, 0x06, 0x00, 0x00, // Code for char ^
0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Code for char _
0x00, 0x00, 0x01, 0x02, 0x00, 0x00, // Code for char `
0x38, 0x44, 0x44, 0x44, 0x7C, 0x00, // Code for char a
0x7F, 0x44, 0x44, 0x44, 0x38, 0x00, // Code for char b
0x38, 0x44, 0x44, 0x44, 0x28, 0x00, // Code for char c
0x38, 0x44, 0x44, 0x44, 0x7F, 0x00, // Code for char d
0x38, 0x54, 0x54, 0x54, 0x58, 0x00, // Code for char e
0x00, 0x04, 0x7E, 0x05, 0x00, 0x00, // Code for char f
0x18, 0xA4, 0xA4, 0xA4, 0x7C, 0x00, // Code for char g
0x7F, 0x04, 0x04, 0x04, 0x78, 0x00, // Code for char h
0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, // Code for char i
0x00, 0x40, 0x3D, 0x00, 0x00, 0x00, // Code for char j
0x7F, 0x20, 0x10, 0x28, 0x44, 0x00, // Code for char k
0x00, 0x00, 0x3F, 0x40, 0x00, 0x00, // Code for char l
0x78, 0x04, 0x78, 0x04, 0x78, 0x00, // Code for char m
0x04, 0x78, 0x04, 0x04, 0x78, 0x00, // Code for char n
0x38, 0x44, 0x44, 0x44, 0x38, 0x00, // Code for char o
0xF8, 0x44, 0x44, 0x44, 0x38, 0x00, // Code for char p
0x38, 0x44, 0x44, 0x44, 0xF8, 0x00, // Code for char q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x00, // Code for char r
0x48, 0x54, 0x54, 0x54, 0x24, 0x00, // Code for char s
0x00, 0x04, 0x3F, 0x44, 0x00, 0x00, // Code for char t
0x3C, 0x40, 0x40, 0x40, 0x7C, 0x00, // Code for char u
0x0C, 0x30, 0x40, 0x30, 0x0C, 0x00, // Code for char v
0x1C, 0x60, 0x1C, 0x60, 0x1C, 0x00, // Code for char w
0x44, 0x28, 0x10, 0x28, 0x44, 0x00, // Code for char x
0x44, 0x48, 0x30, 0x08, 0x04, 0x00, // Code for char y
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, // Code for char z
0x00, 0x08, 0x36, 0x41, 0x00, 0x00, // Code for char {
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, // Code for char |
0x00, 0x41, 0x36, 0x08, 0x00, 0x00, // Code for char }
0x08, 0x04, 0x08, 0x08, 0x04, 0x00, // Code for char ~
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x14, 0x3E, 0x55, 0x55, 0x41, 0x00, // Code for char €
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0xA0, 0x60, 0x00, 0x00, // Code for char ‚
0x00, 0x84, 0x7E, 0x05, 0x01, 0x00, // Code for char ƒ
0xA0, 0x60, 0x00, 0xA0, 0x60, 0x00, // Code for char „
0x40, 0x00, 0x40, 0x00, 0x40, 0x00, // Code for char …
0x04, 0x04, 0xFF, 0x04, 0x04, 0x00, // Code for char †
0x24, 0x24, 0xFF, 0x24, 0x24, 0x00, // Code for char ‡
0x00, 0x02, 0x01, 0x02, 0x00, 0x00, // Code for char ˆ
0x63, 0x13, 0x6C, 0x63, 0x60, 0x60, // Code for char ‰
0x48, 0x55, 0x56, 0x55, 0x24, 0x00, // Code for char Š
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ‹
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Œ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ž
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ‘
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ’
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char “
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ”
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char •
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char –
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char —
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ˜
0x01, 0x07, 0x01, 0x07, 0x03, 0x07, // Code for char ™
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char š
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ›
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char œ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ž
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ÿ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¡
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¢
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char £
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¤
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¥
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¦
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char §
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¨
0x7E, 0x81, 0xBD, 0xA5, 0x81, 0x7E, // Code for char ©
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ª
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char «
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¬
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char
0x7E, 0x81, 0xBD, 0x9D, 0xA1, 0x7E, // Code for char ®
0x01, 0x01, 0x01, 0x01, 0x01, 0x00, // Code for char ¯
0x00, 0x02, 0x05, 0x02, 0x00, 0x00, // Code for char °
0x00, 0x48, 0x5C, 0x48, 0x00, 0x00, // Code for char ±
0x00, 0x09, 0x0D, 0x0A, 0x00, 0x00, // Code for char ²
0x00, 0x09, 0x0D, 0x0F, 0x00, 0x00, // Code for char ³
0x00, 0x00, 0x02, 0x01, 0x00, 0x00, // Code for char ´
0xFC, 0x40, 0x40, 0x40, 0x3C, 0x00, // Code for char µ
0x06, 0x0F, 0xFF, 0x01, 0xFF, 0x01, // Code for char ¶
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ·
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¸
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¹
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char º
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char »
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¼
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ½
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¾
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ¿
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char À
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Á
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Â
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ã
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ä
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Å
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Æ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ç
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char È
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char É
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ê
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ë
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ì
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Í
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Î
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ï
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ð
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ñ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ò
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ó
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ô
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Õ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ö
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ×
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ø
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ù
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ú
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Û
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ü
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Ý
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char Þ
0xFE, 0x49, 0x49, 0x56, 0x20, 0x00, // Code for char ß
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char à
0xFE, 0x49, 0x49, 0x56, 0x20, 0x00, // Code for char á
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char â
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ã
0x38, 0x45, 0x44, 0x45, 0x7C, 0x00, // Code for char ä
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char å
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char æ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ç
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char è
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char é
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ê
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ë
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ì
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char í
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char î
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ï
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ð
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ñ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ò
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ó
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ô
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char õ
0x30, 0x4A, 0x48, 0x4A, 0x30, 0x00, // Code for char ö
0x08, 0x08, 0x2A, 0x08, 0x08, 0x00, // Code for char ÷
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ø
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ù
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ú
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char û
0x38, 0x42, 0x40, 0x42, 0x78, 0x00, // Code for char ü
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ý
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char þ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ÿ
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Code for char
};
Display.h
Can someone tell me whats wrong?
Thanks in advance.
Download BugAVRgcc_Char.zip from http://tiny.systems/categorie/lcdProjekt/FragenAntworten.html and extract the new libraries