เถียงกับ Gemini ทั้งวัน ขอภาพธงชาติแบบเคลื่อนไหว ไปแสดงบนจอ LCD 1.8 นิ้ว ตอนแรก Gemini ก็ทำท่ากลุ่มใจ บอกว่าจะใช้ esp8266 จริงเหรอ ช้านะ! เอาน่า!! เรายืนยันว่าจะใช้
Gemini บอกได้ จัดไป ให้ไปโหลดภาพ .gif มาเลย แล้วก็ให้ทำแบบนั้นแบบนี้ สรุปทำงานไม่ได้ esp8266 รีเซตรัวๆ ก็นะ…ก็พอจะรู้อยู่ แต่ก็บังคับให้ Gemini หาทางออก ทำต่อไป และ ภาพแสดงต้องไม่กระพริบ Gemini ก็หาหลักการให้ ถ้าส่งภาพทั้งหมดพร้อมกัน รีเซต งั้นก็ตัดแบ่งเป็นบล็อกๆแล้วส่ง จะได้ไม่เกิดการรีเซต หลักการได้ แต่ พออัพโปรแกรมจริงทำไม่ได้ แล้วก็ให้กำลังใจเราว่าใกล้สำเร็จแล้ว!! พาเข้าป่าไปเรื่อยๆ ท้ายสุดหมดหนทางหาทางออกป่าไม่ได้ 555
เอาใหม่ มาเริ่มใหม่กัน เอาแค่ภาพ 4 ภาพยิงจุดแบบ drawPixel กระพริบได้ เห็นการสแกนไม่เป็นไร นั่นไง ทีง่ายๆแบบนี้ทำได้เลย พร้อมอธิบายวิธีการอย่างดี เริ่มจาก
1. หาภาพ .gif ที่ต้องการ เอาไปเข้าโปรแกรมแยกไฟล์ ให้เป็น .png (ไฟล์ภาพ)
2. นำภาพแปลงเป็น hex ไฟล์แบบ 16 บิต และทำเป็นไฟล์ .h
3.นำเข้าไฟล์ และเรียกจากโปรแกรมใน arduino
4.นำไฟล์มาพล็อตลงจอที่ละจุด ด้วยคำสั่ง drawPixel
โปรแกรมที่ได้มา เป็นการสั่งให้ Gemini เขียนให้ทั้งหมด ที่ทำเองมีแต่เอาภาพไปแปลงเป็นไฟล์ .h ตามคำแนะนำและลิงค์ที่มาจาก Gemini เท่านั้นครับผม
โปรแกรมถ้าเขียนเองอาจทำได้ดีกว่านี้ หรือเปล่านะ!!
https://www.basiclite.com/web/index.php?action=dlattach;topic=2206.0;attach=2779




#include <Adafruit_GFX.h> // ไลบรารีกราฟิกหลัก
#include <Adafruit_ST7735.h> // ไลบรารีเฉพาะฮาร์ดแวร์สำหรับ ST7735
// รวมไฟล์รูปภาพทั้งหมดของคุณที่นี่
#include “f11.h” // สมมติว่าไฟล์นี้มี ‘frame11’
#include “f22.h” // สมมติว่าไฟล์นี้มี ‘frame12’
#include “f33.h” // สมมติว่าไฟล์นี้มี ‘frame13’
#include “f44.h” // สมมติว่าไฟล์นี้มี ‘frame14’
// สำหรับการเชื่อมต่อบอร์ดเบรกเอาท์ คุณสามารถใช้ขาใดก็ได้ 2 หรือ 3 ขา
// ขาเหล่านี้ยังใช้ได้กับ 1.8″ TFT shield
#define TFT_CS 15
#define TFT_RST 0 // คุณสามารถต่อกับขา Reset ของ Arduino ได้
// ในกรณีนั้น ให้กำหนดขา #define นี้เป็น 0!
#define TFT_DC 2
// สร้างอ็อบเจกต์ Adafruit_ST7735 สำหรับควบคุมหน้าจอ
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// กำหนดขนาดของรูปภาพของคุณ ตรวจสอบให้แน่ใจว่ารูปภาพทั้งหมดมีขนาดเท่ากัน
const int IMAGE_WIDTH = 160; // ความกว้างของรูปภาพ
const int IMAGE_HEIGHT = 105; // ความสูงของรูปภาพ
// สร้างอาร์เรย์ของพอยน์เตอร์ชี้ไปยังข้อมูลรูปภาพของคุณ
const unsigned short* image_data[] = {
frame11,
frame22,
frame33,
frame44
};
// คำนวณจำนวนรูปภาพทั้งหมดในอาร์เรย์
const int NUM_IMAGES = sizeof(image_data) / sizeof(image_data[0]);
void setup() {
tft.initR(INITR_BLACKTAB); // เริ่มต้นการทำงานของหน้าจอ TFT ด้วยการตั้งค่าสีดำ
tft.setRotation(3); // กำหนดการหมุนของหน้าจอ (0 คือแนวตั้งปกติ)
tft.fillScreen(ST7735_BLACK); // เติมหน้าจอด้วยสีดำทั้งหมด (ล้างหน้าจอ)
pinMode(D0, OUTPUT);
analogWrite(D0, 0);
}
void loop() {
// วนลูปสำหรับแสดงรูปภาพแต่ละรูป
for (int i = 0; i < NUM_IMAGES; i++) {
// แสดงรูปภาพปัจจุบัน
int h = IMAGE_HEIGHT, w = IMAGE_WIDTH, row, col, buffidx = 0;
for (row = 0; row < h; row++) { // วนลูปทีละบรรทัด (ความสูง)
for (col = 0; col < w; col++) { // วนลูปทีละพิกเซลในแต่ละบรรทัด (ความกว้าง)
// เพื่ออ่านข้อมูลจากหน่วยความจำ Flash (PROGMEM) ต้องใช้ pgm_read_XXX
// เนื่องจากรูปภาพเก็บเป็น uint16_t (16 บิต) จึงใช้ pgm_read_word
tft.drawPixel(col, row, pgm_read_word(image_data[i] + buffidx));
buffidx++;
} // สิ้นสุดการวนลูปพิกเซล
}
delay(100); // แสดงรูปภาพแต่ละรูปเป็นเวลา 1 วินาที (ปรับเปลี่ยนได้ตามต้องการ)
}
}