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ı

OLEDNodeMCU
GNDGND
VCCVCC
SCLD1
SDAD2
NodeMCU ESP8266 ile WiFi Üzerinden OLED Mesaj Uygulaması nodemcu esp8266,oled mesaj

Proje Görüntüleri

NodeMCU ESP8266 ile WiFi Üzerinden OLED Mesaj Uygulaması nodemcu esp8266,oled mesaj

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.

NodeMCU ESP8266 ile WiFi Üzerinden OLED Mesaj Uygulaması nodemcu esp8266,oled mesaj
NodeMCU ESP8266 ile WiFi Üzerinden OLED Mesaj Uygulaması nodemcu esp8266,oled mesaj

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.