NodeMCU ESP8266 ile WiFi Üzerinden OLED Mesaj Uygulaması
NodeMCU ESP8266 yazılarımıza yeni bir tanesini ekliyoruz. Bu yazımızda ESP8266 ile WiFi üzerinden OLED ekrana mesaj gönderme uygulaması yapıyoruz. Bu yazıya kadar yazdığımız tüm ESP8266 yazılarımızda Arduino IDE’ye NodeMCU desteği eklemeyi, IDE üzerinden program yüklemeyi, ve .BIN dosyasını flashlamayı incelemiştik. Bu yazımızdan itibaren bu kısımları atlayarak doğrudan içeriğe geçiyoruz. Bu adımları öğrenmek için daha önce ki NodeMCU yazılarımıza aşağıdaki bağlantılardan erişebilirsiniz.
Yazının en alt tarafında, “Hepsi Bir Arada Kod” başlıklı kısımda bütün kodların bir araya toplandığı(font hariç) hazır bir kod var, isterseniz doğrudan onu kullanabilir ya da buradan hazır olarak indirebilirsiniz.
Devre Şeması
OLED | NodeMCU |
---|---|
GND | GND |
VCC | VCC |
SCL | D1 |
SDA | D2 |
Proje Görüntüleri
Bağlantıları ve kurulumu yaptıktan sonra, OLED ekran üzerindeki adresi, bir web tarayıcı yoluyla açtığınız zaman karşınıza gelen metin giriş yerine mesajını yazabilirsiniz.
Proje Kodu – Ana Program
#pragma GCC diagnostic ignored "-Wwrite-strings" #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <Wire.h> String form = "<p>" "<center>" "<h1>Wifi Mesaj Uygulamasi</h1>" "<img src='https://devreyakan.com/wp-content/uploads/2020/09/oNRdj.jpg'>" "<form action='msg'><p>Mesaj yaz ... <input type='text' name='msg' size=50 autofocus> <input type='submit' value='Gonder'></form>" "</center>"; long period; #define SSID "WIFI-AG-ISMI" // Wifi İsmi #define PASS "WIFI-SIFRESI" // Wifi Şifresi ESP8266WebServer server(80); // HTTP sunucu portu 80 void setup(void) { //ESP.wdtDisable(); // hata ayıklayıcı kapat Serial.begin(115200); // baudrate Wire.begin(4, 5); // I2C pinleri SCL = D1 , SDA = D2 init_OLED(); // Oled başlat reset_display(); WiFi.begin(SSID, PASS); // Wifi ağına bağlan while (WiFi.status() != WL_CONNECTED) { // Bağlanmayı bekliyoruz delay(500); Serial.print("."); SendChar('.'); } // Sunucu için bitiş noktası server.on("/", []() { server.send(200, "text/html", form); }); server.on("/msg", handle_msg); server.begin(); // Sunucuyu başlat Serial.print("SSID : "); // Wifi adresi Serial.println(SSID); clear_display(); // Ekranı temizle //sendStrXY("SSID:" , 0, 0); // Yazılacak satır //sendStrXY(SSID, 0, 7); // İp adres, yazdırma char result[16]; sprintf(result, "%3d.%3d.%3d.%3d", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3]); sendStrXY("Sunucu Hazir:", 1, 0); // OLED satır 1 sendStrXY(result, 3, 0); // OLED satır 3 Serial.println("Sunucu Hazir: "); Serial.println(WiFi.localIP()); // Serial ekrana yazdırma Serial.println(); Serial.println(result); sendStrXY("", 5, 0); // OLED satır 5 sendStrXY("", 6, 0); // OLED satır 6 sendStrXY("devreyakan wifi", 7, 0); // OLED satır 7 } void loop(void) { server.handleClient(); // checks for incoming messages }
Proje Kodu – Ağ Yaması
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> /* handles the messages coming from the webbrowser, restores a few special characters and constructs the strings that can be sent to the oled display */ void handle_msg() { clear_display(); // clears oled server.send(200, "text/html", form); // Send same page so they can send another msg // Display msg on Oled String msg = server.arg("msg"); Serial.println(msg); String decodedMsg = msg; // Restore special characters that are misformed to %char by the client browser decodedMsg.replace("+", " "); decodedMsg.replace("%21", "!"); decodedMsg.replace("%22", ""); decodedMsg.replace("%23", "#"); decodedMsg.replace("%24", "$"); decodedMsg.replace("%25", "%"); decodedMsg.replace("%26", "&"); decodedMsg.replace("%27", "'"); decodedMsg.replace("%28", "("); decodedMsg.replace("%29", ")"); decodedMsg.replace("%2A", "*"); decodedMsg.replace("%2B", "+"); decodedMsg.replace("%2C", ","); decodedMsg.replace("%2F", "/"); decodedMsg.replace("%3A", ":"); decodedMsg.replace("%3B", ";"); decodedMsg.replace("%3C", "<"); decodedMsg.replace("%3D", "="); decodedMsg.replace("%3E", ">"); decodedMsg.replace("%3F", "?"); decodedMsg.replace("%40", "@"); //Serial.println(decodedMsg); // print original string to monitor unsigned int lengte = decodedMsg.length(); // length of received message for (int i = 0; i < lengte; i++) // prints up to 8 rows of 16 characters. { char c = decodedMsg[i]; Serial.print(c); //decodedMsg[i]); if (i < 16) { sendCharXY(c, 0, i); } else if (i < 32) { sendCharXY(c, 1, i - 16); } else if (i < 48) { sendCharXY(c, 2, i - 32); } else if (i < 64) { sendCharXY(c, 3, i - 48); } else if (i < 80) { sendCharXY(c, 4, i - 64); } else if (i < 96) { sendCharXY(c, 5, i - 80); } else if (i < 112) { sendCharXY(c, 6, i - 96); } else if (i < 128) { sendCharXY(c, 7, i - 112); } } //Serial.println(' '); // new line in monitor }
Proje Kodu – OLED Ayarları
#include <Wire.h> #include "font.h" #define OLED_address 0x3c // all the OLED's I have seen have this address //#define offset 0x00 // SDD1306 // offset=0 for SSD1306 controller #define offset 0x02 // SH1106 // offset=2 for SH1106 controller //==========================================================// // Resets display depending on the actual mode. static void reset_display(void) { displayOff(); clear_display(); displayOn(); } //==========================================================// // Turns display on. void displayOn(void) { sendcommand(0xaf); //display on } //==========================================================// // Turns display off. void displayOff(void) { sendcommand(0xae); //display off } //==========================================================// // Clears the display by sendind 0 to all the screen map. static void clear_display(void) { unsigned char i, k; for (k = 0; k < 8; k++) { setXY(k, 0); { for (i = 0; i < (128 + 2 * offset); i++) //locate all COL { SendChar(0); //clear all COL //delay(10); } } } } //==========================================================// // Actually this sends a byte, not a char to draw in the display. // Display's chars uses 8 byte font the small ones and 96 bytes // for the big number font. static void SendChar(unsigned char data) { Wire.beginTransmission(OLED_address); // begin transmitting Wire.write(0x40);//data mode Wire.write(data); Wire.endTransmission(); // stop transmitting } //==========================================================// // Prints a display char (not just a byte) in coordinates X Y, // being multiples of 8. This means we have 16 COLS (0-15) // and 8 ROWS (0-7). static void sendCharXY(unsigned char data, int X, int Y) { setXY(X, Y); Wire.beginTransmission(OLED_address); // begin transmitting Wire.write(0x40);//data mode for (int i = 0; i < 8; i++) Wire.write(pgm_read_byte(myFont[data - 0x20] + i)); Wire.endTransmission(); // stop transmitting } //==========================================================// // Used to send commands to the display. static void sendcommand(unsigned char com) { Wire.beginTransmission(OLED_address); //begin transmitting Wire.write(0x80); //command mode Wire.write(com); Wire.endTransmission(); // stop transmitting } //==========================================================// // Set the cursor position in a 16 COL * 8 ROW map. static void setXY(unsigned char row, unsigned char col) { sendcommand(0xb0 + row); //set page address sendcommand(offset + (8 * col & 0x0f)); //set low col address sendcommand(0x10 + ((8 * col >> 4) & 0x0f)); //set high col address } //==========================================================// // Prints a string regardless the cursor position. static void sendStr(unsigned char *string) { unsigned char i = 0; while (*string) { for (i = 0; i < 8; i++) { SendChar(pgm_read_byte(myFont[*string - 0x20] + i)); } *string++; } } //==========================================================// // Prints a string in coordinates X Y, being multiples of 8. // This means we have 16 COLS (0-15) and 8 ROWS (0-7). static void sendStrXY( char *string, int X, int Y) { setXY(X, Y); unsigned char i = 0; while (*string) { for (i = 0; i < 8; i++) { SendChar(pgm_read_byte(myFont[*string - 0x20] + i)); } *string++; } } //==========================================================// // Inits oled and draws logo at startup static void init_OLED(void) { sendcommand(0xae); //display off sendcommand(0xa6); //Set Normal Display (default) // Adafruit Init sequence for 128x64 OLED module sendcommand(0xAE); //DISPLAYOFF sendcommand(0xD5); //SETDISPLAYCLOCKDIV sendcommand(0x80); // the suggested ratio 0x80 sendcommand(0xA8); //SSD1306_SETMULTIPLEX sendcommand(0x3F); sendcommand(0xD3); //SETDISPLAYOFFSET sendcommand(0x0); //no offset sendcommand(0x40 | 0x0); //SETSTARTLINE sendcommand(0x8D); //CHARGEPUMP sendcommand(0x14); sendcommand(0x20); //MEMORYMODE sendcommand(0x00); //0x0 act like ks0108 //sendcommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg sendcommand(0xA0); //sendcommand(0xC8); //COMSCANDEC Rotate screen 180 Deg sendcommand(0xC0); sendcommand(0xDA); //0xDA sendcommand(0x12); //COMSCANDEC sendcommand(0x81); //SETCONTRAS sendcommand(0xCF); // sendcommand(0xd9); //SETPRECHARGE sendcommand(0xF1); sendcommand(0xDB); //SETVCOMDETECT sendcommand(0x40); sendcommand(0xA4); //DISPLAYALLON_RESUME sendcommand(0xA6); //NORMALDISPLAY clear_display(); sendcommand(0x2e); // stop scroll //----------------------------REVERSE comments----------------------------// sendcommand(0xa0); //seg re-map 0->127(default) sendcommand(0xa1); //seg re-map 127->0 sendcommand(0xc8); // delay(1000); //----------------------------REVERSE comments----------------------------// // sendcommand(0xa7); //Set Inverse Display // sendcommand(0xae); //display off sendcommand(0x20); //Set Memory Addressing Mode sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode // sendcommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET) }
Proje Kodu – OLED Font
const char myFont[][8] PROGMEM = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}
};
Hepsi Bir Arada Kod
/*
Version 1.0 supports OLED display's with either SDD1306 or with SH1106 controller
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include "font.h"
#define offset 0x00 // SDD1306 // offset=0 for SSD1306 controller
//#define offset 0x02 // SH1106 // offset=2 for SH1106 controller
#define OLED_address 0x3c // all the OLED's I have seen have this address
#define SSID "wifi-adiniz" // insert your SSID
#define PASS "wiif-sifreniz" // insert your password
// ******************* String form to sent to the client-browser ************************************
String form =
"<p>"
"<center>"
"<h1>devreyakan.com</h1>"
"<form action='msg'><p>Selam <input type='text' name='msg' size=50 autofocus> <input type='submit' value='Gonder'></form>"
"</center>";
ESP8266WebServer server(80); // HTTP server will listen at port 80
long period;
static void sendCharXY(unsigned char, int, int);
static void init_OLED(void);
static void reset_display();
static void sendStrXY( char*, int, int);
void displayOff(void);
void displayOn(void);
static void sendcommand(unsigned char);
static void clear_display(void);
static void setXY(unsigned char, unsigned char);
static void SendChar(unsigned char);
/*
handles the messages coming from the webbrowser, restores a few special characters and
constructs the strings that can be sent to the oled display
*/
void handle_msg() {
clear_display(); // clears oled
server.send(200, "text/html", form); // Send same page so they can send another msg
// Display msg on Oled
String msg = server.arg("msg");
Serial.println(msg);
String decodedMsg = msg;
// Restore special characters that are misformed to %char by the client browser
decodedMsg.replace("+", " ");
decodedMsg.replace("%21", "!");
decodedMsg.replace("%22", "");
decodedMsg.replace("%23", "#");
decodedMsg.replace("%24", "$");
decodedMsg.replace("%25", "%");
decodedMsg.replace("%26", "&");
decodedMsg.replace("%27", "'");
decodedMsg.replace("%28", "(");
decodedMsg.replace("%29", ")");
decodedMsg.replace("%2A", "*");
decodedMsg.replace("%2B", "+");
decodedMsg.replace("%2C", ",");
decodedMsg.replace("%2F", "/");
decodedMsg.replace("%3A", ":");
decodedMsg.replace("%3B", ";");
decodedMsg.replace("%3C", "<");
decodedMsg.replace("%3D", "=");
decodedMsg.replace("%3E", ">");
decodedMsg.replace("%3F", "?");
decodedMsg.replace("%40", "@");
//Serial.println(decodedMsg); // print original string to monitor
unsigned int lengte = decodedMsg.length(); // length of received message
for (int i=0;i<lengte;i++) { // prints up to 8 rows of 16 characters.
char c = decodedMsg[i];
Serial.print(c); //decodedMsg[i]);
if (i<16) {sendCharXY(c,0,i);}
else if (i<32) {sendCharXY(c,1,i-16);}
else if (i<48) {sendCharXY(c,2,i-32);}
else if (i<64) {sendCharXY(c,3,i-48);}
else if (i<80) {sendCharXY(c,4,i-64);}
else if (i<96) {sendCharXY(c,5,i-80);}
else if (i<112) {sendCharXY(c,6,i-96);}
else if (i<128) {sendCharXY(c,7,i-112);}
}
//Serial.println(' '); // new line in monitor
}
void setup(void) {
//ESP.wdtDisable(); // used to debug, disable wachdog timer,
Serial.begin(115200); // full speed to monitor
Wire.begin(0,2); // Initialize I2C and OLED Display
init_OLED(); //
reset_display();
WiFi.begin(SSID, PASS); // Connect to WiFi network
while (WiFi.status() != WL_CONNECTED) { // Wait for connection
delay(500);
Serial.print(".");
}
// Set up the endpoints for HTTP server, Endpoints can be written as inline functions:
server.on("/", []() {
server.send(200, "text/html", form);
});
server.on("/msg", handle_msg); // And as regular external functions:
server.begin(); // Start the server
clear_display();
Serial.print("SSID:"); // prints SSID in monitor
Serial.println(SSID); // to monitor
sendStrXY("SSID:",0,0); sendStrXY(SSID,0,5); // prints SSID on OLED
char result[16];
sprintf(result, "%d.%d.%d.%d", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3]);
Serial.println();Serial.println(result);
sendStrXY(result,2,0);
Serial.println("WebServer ready! ");
sendStrXY("WebServer ready!",4,0); // OLED first message
Serial.println(WiFi.localIP()); // Serial monitor prints localIP
Serial.print(analogRead(A0));
int test = 13;
pinMode(test,OUTPUT);
digitalWrite(test,HIGH);
delay(1000);
digitalWrite(test,LOW);
}
void loop(void) {
server.handleClient(); // checks for incoming messages
}
//==========================================================//
// Resets display depending on the actual mode.
static void reset_display(void) {
displayOff();
clear_display();
displayOn();
}
//==========================================================//
// Turns display on.
void displayOn(void) {
sendcommand(0xaf); //display on
}
//==========================================================//
// Turns display off.
void displayOff(void) {
sendcommand(0xae); //display off
}
//==========================================================//
// Clears the display by sendind 0 to all the screen map.
static void clear_display(void) {
unsigned char i,k;
for(k=0;k<8;k++) {
setXY(k,0);
{
for(i=0;i<(128 + 2 * offset);i++) { //locate all COL
SendChar(0); //clear all COL
//delay(10);
}
}
}
}
//==========================================================//
// Actually this sends a byte, not a char to draw in the display.
// Display's chars uses 8 byte font the small ones and 96 bytes
// for the big number font.
static void SendChar(unsigned char data) {
//if (interrupt && !doing_menu) return; // Stop printing only if interrupt is call but not in button functions
Wire.beginTransmission(OLED_address); // begin transmitting
Wire.write(0x40);//data mode
Wire.write(data);
Wire.endTransmission(); // stop transmitting
}
//==========================================================//
// Prints a display char (not just a byte) in coordinates X Y,
// being multiples of 8. This means we have 16 COLS (0-15)
// and 8 ROWS (0-7).
static void sendCharXY(unsigned char data, int X, int Y) {
setXY(X, Y);
Wire.beginTransmission(OLED_address); // begin transmitting
Wire.write(0x40);//data mode
for(int i=0;i<8;i++)
Wire.write(pgm_read_byte(myFont[data-0x20]+i));
Wire.endTransmission(); // stop transmitting
}
//==========================================================//
// Used to send commands to the display.
static void sendcommand(unsigned char com) {
Wire.beginTransmission(OLED_address); //begin transmitting
Wire.write(0x80); //command mode
Wire.write(com);
Wire.endTransmission(); // stop transmitting
}
//==========================================================//
// Set the cursor position in a 16 COL * 8 ROW map.
static void setXY(unsigned char row,unsigned char col) {
sendcommand(0xb0+row); //set page address
sendcommand(offset+(8*col&0x0f)); //set low col address
sendcommand(0x10+((8*col>>4)&0x0f)); //set high col address
}
//==========================================================//
// Prints a string regardless the cursor position.
static void sendStr(unsigned char *string) {
unsigned char i=0;
while(*string) {
for(i=0;i<8;i++) {
SendChar(pgm_read_byte(myFont[*string-0x20]+i));
}
*string++;
}
}
//==========================================================//
// Prints a string in coordinates X Y, being multiples of 8.
// This means we have 16 COLS (0-15) and 8 ROWS (0-7).
static void sendStrXY( char *string, int X, int Y) {
setXY(X,Y);
unsigned char i=0;
while(*string) {
for(i=0;i<8;i++) {
SendChar(pgm_read_byte(myFont[*string-0x20]+i));
}
*string++;
}
}
//==========================================================//
// Inits oled and draws logo at startup
static void init_OLED(void) {
sendcommand(0xae); //display off
sendcommand(0xa6); //Set Normal Display (default)
// Adafruit Init sequence for 128x64 OLED module
sendcommand(0xAE); //DISPLAYOFF
sendcommand(0xD5); //SETDISPLAYCLOCKDIV
sendcommand(0x80); // the suggested ratio 0x80
sendcommand(0xA8); //SSD1306_SETMULTIPLEX
sendcommand(0x3F);
sendcommand(0xD3); //SETDISPLAYOFFSET
sendcommand(0x0); //no offset
sendcommand(0x40 | 0x0); //SETSTARTLINE
sendcommand(0x8D); //CHARGEPUMP
sendcommand(0x14);
sendcommand(0x20); //MEMORYMODE
sendcommand(0x00); //0x0 act like ks0108
//sendcommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg
sendcommand(0xA0);
//sendcommand(0xC8); //COMSCANDEC Rotate screen 180 Deg
sendcommand(0xC0);
sendcommand(0xDA); //0xDA
sendcommand(0x12); //COMSCANDEC
sendcommand(0x81); //SETCONTRAS
sendcommand(0xCF); //
sendcommand(0xd9); //SETPRECHARGE
sendcommand(0xF1);
sendcommand(0xDB); //SETVCOMDETECT
sendcommand(0x40);
sendcommand(0xA4); //DISPLAYALLON_RESUME
sendcommand(0xA6); //NORMALDISPLAY
clear_display();
sendcommand(0x2e); // stop scroll
//----------------------------REVERSE comments----------------------------//
sendcommand(0xa0); //seg re-map 0->127(default)
sendcommand(0xa1); //seg re-map 127->0
sendcommand(0xc8);
delay(1000);
//----------------------------REVERSE comments----------------------------//
// sendcommand(0xa7); //Set Inverse Display
// sendcommand(0xae); //display off
sendcommand(0x20); //Set Memory Addressing Mode
sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode
// sendcommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET)
}
Font Kodu
const char myFont[][8] PROGMEM = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}
};
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.