จอ OLED เชื่อมต่อไม่ได้

เขียน Code จอ OLED แล้วเชื่อมต่อไม่ได้
ตอนทดลองเขียน Code เล็กๆ เทสตัวจอ OLED ก็ได้งานได้ปกติ
แต่ผมเอามารวมกับตัว Code ของโปรแกรมที่ผมเขียนทั้งหมด มันเชื่อมต่อไม่ได้ครับ

//ตัวที่ฝาย
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <LoRa.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_RESET     -1 
Adafruit_SSD1306 OLED(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);//ขาA4 -> SDA ขาA5 -> SCL

int relay1 = 3;
int relay2 = 4;

int pin1 = 5;
int pin2 = 6;
int pin3 = 7;
int pin4 = 8;

int data = 0;

String text;
String text1 = "ฝายปิด 0";
String text2 = "ฝายเปิด 45";
String text3 = "ฝายเปิด 90";
String text4 = "ฝายปิด 45";

void setup(){
  Serial.begin(9600);
  if (!OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // สั่งให้จอ OLED เริ่มทำงานที่ Address 0x3C
      Serial.println("SSD1306 allocation failed");
    } else {
      Serial.println("ArdinoAll OLED Start Work !!!");
    }
  while (!Serial);
  Serial.println("LoRa-sender/received");
  pinMode(relay1,OUTPUT);
  pinMode(relay2,OUTPUT);
  pinMode(pin1,INPUT);
  pinMode(pin2,INPUT);
  pinMode(pin3,INPUT);
  pinMode(pin4,INPUT);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while(1);
  } 
}

void UP(){
  digitalWrite(relay1,HIGH);
  digitalWrite(relay2,LOW);
}

void DOWN(){
  digitalWrite(relay1,LOW);
  digitalWrite(relay2,HIGH);
}

void STOP(){
  digitalWrite(relay1,HIGH);
  digitalWrite(relay2,HIGH);
}

void LoRaDOWN0(){
    LoRa.beginPacket();
    LoRa.print(text1);
    LoRa.endPacket();

    Serial.print("Send '");
    Serial.print(text1);
    Serial.println("'");
}

void LoRaUP45(){
    LoRa.beginPacket();
    LoRa.print(text2);
    LoRa.endPacket();

    Serial.print("Send '");
    Serial.print(text2);
    Serial.println("'");
}

void LoRaUP90(){
    LoRa.beginPacket();
    LoRa.print(text3);
    LoRa.endPacket();

    Serial.print("Send '");
    Serial.print(text3);
    Serial.println("'");
}

void LoRaDOWN45(){
    LoRa.beginPacket();
    LoRa.print(text4);
    LoRa.endPacket();

    Serial.print("Send '");
    Serial.print(text4);
    Serial.println("'");
}

void SENDUP45(){
  OLED.clearDisplay(); 
  OLED.setTextColor(WHITE, BLACK);  
  OLED.setCursor(0, 0); 
  OLED.setTextSize(2); 
  OLED.println("LoRa Sender");
  OLED.setTextSize(2);
  OLED.print("sending...");
  
  OLED.setCursor(0,33);
  OLED.setTextSize(1);
  OLED.println("check dam open 45!!!");
  OLED.setTextSize(2);
  OLED.print("sent complete");
  OLED.display();
}

void SENDUP90(){
  OLED.clearDisplay(); 
  OLED.setTextColor(WHITE, BLACK);  
  OLED.setCursor(0, 0); 
  OLED.setTextSize(2); 
  OLED.println("LoRa Sender");
  OLED.setTextSize(2);
  OLED.print("sending...");
  
  OLED.setCursor(0,33);
  OLED.setTextSize(1);
  OLED.println("check dam open 90!!!");
  OLED.setTextSize(2);
  OLED.print("sent complete");
  OLED.display();
}

void SENDDOWN0(){
  OLED.clearDisplay(); 
  OLED.setTextColor(WHITE, BLACK);  
  OLED.setCursor(0, 0); 
  OLED.setTextSize(2); 
  OLED.println("LoRa Sender");
  OLED.setTextSize(2);
  OLED.print("sending...");
  
  OLED.setCursor(0,33);
  OLED.setTextSize(1);
  OLED.println("check dam close 0!!!");
  OLED.setTextSize(2);
  OLED.print("sent complete");
  OLED.display();
}

void SENDDOWN45(){
  OLED.clearDisplay(); 
  OLED.setTextColor(WHITE, BLACK);  
  OLED.setCursor(0, 0); 
  OLED.setTextSize(2); 
  OLED.println("LoRa Sender");
  OLED.setTextSize(2);
  OLED.print("sending...");
  
  OLED.setCursor(0,33);
  OLED.setTextSize(1);
  OLED.println("check dam close 45!!!");
  OLED.setTextSize(2);
  OLED.print("sent complete");
  OLED.display();
}

void loop(){
  int A = digitalRead(pin1);
  int B = digitalRead(pin2);
  int C = digitalRead(pin3);
  int D = digitalRead(pin4);

// ส่วนการส่งข้อมูล
  if (((A==LOW)&&(B==LOW)&&(C==LOW)&&(D==LOW))&&(data==0)){
    //Serial.print("\t");
    //Serial.print("ไม่มีน้ำ");
   // Serial.println();
    //STOP();
    //LoRaDOWN0();
    data = 0;
    OLED.clearDisplay();
    OLED.display();
  }

  if (((A==HIGH)&&(B==LOW)&&(C==LOW)&&(D==LOW))&&(data==0)){
    Serial.print("\t");
    Serial.print("ขึ้น 45");
    Serial.println();
    UP();
    LoRaUP45();
    SENDUP45();
    data = 0;
  }
  
  if (((A==HIGH)&&(B==HIGH)&&(C==HIGH)&&(D==LOW))&&(data==0)){
    Serial.print("\t");
    Serial.print("ขึ้น 90");
    Serial.println();
    UP();
    LoRaUP90();
    SENDUP90();
    data = 1;
  }

  if (((A==HIGH)&&(B==HIGH)&&(C==HIGH)&&(D==HIGH))&&(data==1)){
    Serial.print("\t");
    Serial.print("ลงที่ 0");
    Serial.println();
    DOWN();
    LoRaDOWN0();
    SENDDOWN0();
    data =0;
  }

  if (((A==HIGH)&&(B==HIGH)&&(C==HIGH)&&(D==LOW))&&(data==0)){
    Serial.print("\t");
    Serial.print("ขึ้น 90");
    Serial.println();
    UP();
    LoRaUP90();
    SENDUP90();
    data = 1;
  }

  if (((A==HIGH)&&(B==HIGH)&&(C==LOW)&&(D==LOW))&&(data==1)){
    Serial.print("\t");
    Serial.print("ลงที่ 45");
    Serial.println();
    DOWN();
    LoRaDOWN45();
    SENDDOWN45();
    data = 1;
  }

  if (((A==LOW)&&(B==LOW)&&(C==LOW)&&(D==LOW))&&(data==1)){
    Serial.print("\t");
    Serial.print("ลงที่ 0");
    Serial.println();
    DOWN();
    LoRaDOWN0();
    SENDDOWN0();
    data = 0;
    //delay(5000);
  }

//ส่วนการรับข้อมูล
  if (LoRa.parsePacket()) {
      String text = LoRa.readString();
      Serial.print("Receiver '");
      Serial.print(text);
      Serial.print("' RSSI is ");
      Serial.println(LoRa.packetRssi());
      if (text=="เปิดฝาย 45"){
        UP();
      }
    }

    if (LoRa.parsePacket()) {
      String text = LoRa.readString();
      Serial.print("Receiver '");
      Serial.print(text);
      Serial.print("' RSSI is ");
      Serial.println(LoRa.packetRssi());
      if (text=="เปิดฝาย 90"){
        UP();
      }
    }

    if (LoRa.parsePacket()) {
      String text = LoRa.readString();
      Serial.print("Receiver '");
      Serial.print(text);
      Serial.print("' RSSI is ");
      Serial.println(LoRa.packetRssi());
      if (text=="ปิดฝาย 45"){
        DOWN();
      }
    }

    if (LoRa.parsePacket()) {
      String text = LoRa.readString();
      Serial.print("Receiver '");
      Serial.print(text);
      Serial.print("' RSSI is ");
      Serial.println(LoRa.packetRssi());
      if (text=="ปิดฝาย 0"){
        DOWN();
        delay(5000);
      }
    }
    
    if (LoRa.parsePacket()) {
      String text = LoRa.readString();
      Serial.print("Receiver '");
      Serial.print(text);
      Serial.print("' RSSI is ");
      Serial.println(LoRa.packetRssi());
      if (text=="หยุด"){
        STOP();
      }
    }
    
}

ต่อแบบไหนครับ ใช้บอร์ดอะไร เห็นใช้คำสั่ง LoRa อธิบายการทำงานทั้งหมดเป็นสังเขปหน่อย

บอร์ดที่ใช้ OLED ( OLED Display Module 128X64 0.96 ")
Arduino Uno RoLa SX1278 433Mhz
การกันแบบ
Vcc - > 5 V
Gnd -> Gnd
SCL -> A5
SDA -> A4

คือ พอกดสวิทช์ตามเงื่อนไง จะให้ทำงานโดยส่งข้อมูล LoRa ออกไป พร้อมกับแสดงข้อความต่างๆบนจอ OLED การทำงานทุกงานเป็นปกติ เช่น การส่งข้อมูล LoRa ออกไป OutPut ที่ทำงานตามเงื่อนไข
ยกเว้นการแสดงผลออกจอ OLED พอกด Monitor ดูก็แสดงข้อความ “SSD1306 allocation failed” เหมือนจะเชื่อมต่อจอ OLED ไม่ได้
ไม่มีอาการ code error สามารถ Upload code ได้ปกติครับ

ผมลองๆหาข้อมูลดู เหมือนจะหน่วยความจำไม่เพียงพอ แต่ผมเองก็ไม่แน่ใจเหมือนกันครับ

เหมือนมีพี่ที่ผมรู้จักเคยเป็นเคสนี้มาก่อนนะครับ ผมจำไม่ได้ว่าเข้าแก้ยังไง เคยถามอยู่ลืมแล้ว 555 รู้สึกว่าจะเปลี่ยนคำสั่งอะไรสักยังนี้แหละ เกี่ยวกับ memory

ก็เห็นวิธีแก้ประมาณนี้อยู่เหมือนกันครับ แต่ยังแก้ไม่ได้เลย 555
อยากจะเพิ่มจอเพื่อแสดงสถานะการทำงานซะหน่อย

เอาลิ้งค์ที่เจอมาแปะหน่อยครับ

https://forum.arduino.cc/index.php?topic=629629.0
https://forum.arduino.cc/index.php?topic=584161.0
https://forum.arduino.cc/index.php?topic=624380.0
https://forum.arduino.cc/index.php?topic=648558.0

ผมเองก็จำไม่ค่อยได้ละครับ ว่าอ่านเว็บไหนไปบ้าง แต่ก็ประมาณนี้อ่ะครับ

วันนี้ไปถามพี่คนนั้นมาแล้วครับ เขาบอกมันจะเป็นตอนที่เขาเพิ่มโค้ตเข้าไปเยอะๆ ขอดูปริมาณการใช้ เมมโมรี่ เทียบมาหน่อย ว่าโค้ตที่เป็น กับไม่เป็น พิ้นที่ memory ต่างกันเท่าไหร่

แบบยังไม่เพิ่มจอ

แบบเพิ่มจอ

ถ้าเราเพิ่มโค้ตแสดงผล น้อย ๆ แสดงผลได้ไหมครับ

อยากรู้ว่าภาษาไทย แสดงได้ไหมถ้าสั่งแค่พื้นฐาน บางทีอาจเป็นเพราะฟอนภาษาไทยไม่รองรับเลยแสดงไม่ได้
ไม่งั้นก็ใส่โค้ตเต็มแต่เป็นคำที่แสดงเป็น ภาษาอังกฤษทั้งหมดดู ว่าได้ไหม

ผมใช้แสดงผลแค่นี้เองครับ ลองภาษาไทยแล้วครับ ออกเป็นภาษาต่างดาวแทนครับ

สรุปว่าโค้ตที่บอกว่าไม่ออก ทำออกรึยังครับ รึว่าตัดไปบางส่วน แล้ว ถึงจะแสดง

รูปที่อัพแบบเพิ่มจอ นั้นคือที่ไม่ออกครับ ส่วนรูปที่แสดงออกหน้าจอได้ เพราะว่าลด Code ให้สั้นลงครับ
แต่อาจจะมีเขียนเพิ่มอีกในอนาคต ซึ่งอาจจะเป็นปัญหาที่อาจจะแสดงหน้าจอไม่ได้อีก

ที่แสดง ออกเจอใช้พื้นที่เท่าไหร่ครับ

ส่วนภาษาไทยต้องไปโหลดฟอนมาก่อนถึงจะออกนะ


อันนี้ที่สามารถแสดงออกจอได้ครับ ถ้าเราเปลี่ยนไปใช้จอ LCD ธรรมดาๆ จะใช้หน่วยความจำน้อยกว่าหรือเปล่าครับ

ที่ทำได้ตอนนี้คือพยายามลดโค้ตลงมาครับหรือไม่ก็ ใช้ตัวที่ ให้ memory เยอะกว่า

ขอบคุณครับ เดี๋ยวจะลองหาหนทางดู ถ้าไม่ได้จริงๆคงต้องลอง จอ LCD ดู

ลองดูการขยาย memory ว่าได้ไหม อย่างของ esp32 เราสามารถขยายเพิ่มได้ แต่ตัว arduino นี้ไม่แน่ใจ

1 Like