Friday, February 21, 2025

Install M5Stick-Launcher for Lilygo T-Deck


 Step 1 :

Pergi ke github ini,  https://github.com/bmorcelli/M5Stick-Launcher/

kemudian klik pada release yang terkini, ada sebelah kanan sekali.


klik dan ianya akan dibawa ke paparan ini.

scrol bawah dan cari Launcher untuk lilygo-t-deck dan download


download dan simpan di lokasi rahsia anda sendiri. kemudian masa utk flash, untuk flash sila ke website ini. https://web.esphome.io/


klik connect dan pilih com port anda. 


kemudian klik install, 


dan choose file, 


dan pilih file yang mula-mula kita save tadi. Lokasi rahsia tadi kena ingat lah dimana.


kemudian klik install


dan tunggu


apabila siap, paparan ini akan muncul.


cabut usb kabel, dan off dan semula tdeck anda dan paparan ini akan muncul sebaik sahaja on.


dan selepas itu, paparan seperti ini pula akan muncul, dan ini bermakna launcher anda berjaya di flash. Kemudian, sediakan sd kad dan masuk lah apa-apa apps kegemaran anda. semoga bermanfaat. 73

Lilygo T-Deck Launcher


Saturday, February 1, 2025

Power Transistor MJ11016G short

 

MJ11016G
ini adalah bacaan MJ11016G yang diambil dari multimeter.

B-E: 0.482V (forward) dan E-B: 0.939V (reversed)

B-C: 0.459V (forward) dan C-B: OL (open)

E-C: 0.388V dan C-E: OL

Untuk transistor NPN yang normal, sepatutnya:

Simpang B-E: sekitar 0.6-0.7V semasa forward, dan beberapa MΩ atau OL semasa reversed

Simpang B-C: sekitar 0.6-0.7V semasa forward, dan beberapa MΩ atau OL semasa reversed

E-C dan C-E: kedua-duanya sepatutnya menunjukkan nilai rintangan tinggi atau OL

Dari bacaan yang diukur, terdapat beberapa tanda tidak normal:

Voltan hadapan B-E terlalu rendah (0.482V)

Bacaan E-B sepatutnya OL, bukan 0.939V

E-C menunjukkan 0.388V yang menandakan ada litar pintas atau kebocoran


Kesimpulannya, transistor ini berkemungkinan besar sudah rosak dan perlu diganti. Semoga bermanfaat. 73 Zaki

Thursday, January 23, 2025

TL494 PWM Controller : bahagian pertama

 

TL494

ini adalah bacaan yang diperoleh daripada PWM TL494, 

pin1=2.474v     pin16=000.8mv

pin2=2.474v     pin15=0.384v 

pin3=3.6v         pin14=4.98v

pin4=0.3v        pin13=4.98v

pin5=1.477v     pin12=14.52v

pin6=3.58v       pin11=14.52v

pin7=0v            pin9=000.9mv

pin8=14.52v      pin9=000.9mv


Berdasarkan bacaan voltan pada pin TL494, mari kita analisis keadaan litar 
dan kenalpasti punca masalah LED overload menyala tanpa load


Analisis Bacaan Pin TL494

  1. Pin 1 (Error Amplifier Input 1): 2.474V  -  Bacaan ini adalah normal.
  2. Pin 2 (Error Amplifier Input 2): 2.474V - Bacaan ini sepadan dengan Pin 1. tiada masalah
  3. Pin 3 (Feedback): 3.6V : Bacaan ini kelihatan tinggi. Pin 3 biasanya bekerja pada 2.5V, kena check resistor dan capacitor dalam tracknya.

        

Pin 4 (Dead Time Control): 0.3V - kelihatan rendah. kena check transistor dlm linenya
Pin 5 (Control Voltage): 1.477V - tiada masalah sbb berada dlm rangenya.
Pin 6 (Error Amplifier Output): 3.58V - Bacaan ini menunjukkan TL494 cuba menghantar  active control, tetapi jika output tidak stabil (Pin 15 dan Pin 16 rendah), protection problem                  Pin 7 (Ground): 0V - normal                                                                                                                Pin 8 (VCC): 14.52V - normal sbb ada 14.52v                                                                                    Pin 9 dan Pin 10 (Output PWM): 0.9mV - sangat rendah, menunjukkan tiada signal dari PWM  yg boleh/mungkin jadi punca. MUNGKIN berpunca drp transistor atau resistor di-linenya                    Pin 11 (VREF): 14.52V - salah ni, biasanya 5V, mungkin TL494 ini rosak?                                       Pin 12 (Power Supply for Reference): 14.52V                                                                                        

     12. Pin 13 dan Pin 14 (Input for Oscillator Timing): 4.98V - normal                                                  13. Pin 15 dan Pin 16 (Output PWM): 0.384V dan 0.8mV - Output PWM sangat rendah            Mungkin TL494 ni rosak? ataupun proteksen dia aktif?

---------------------------------------------------------------------------------------------------------------------
     Plan saya ialah check komponen sekitar TL494 dahulu sebab pin 3 bacaan dia tinggi,              samada perintang atau capacitor problem pada linenya. Check transistor pada line pin 15 dan 16 sbb output low, mungkin ada yang short. Jika semuanya ok, MUNGKIN TL494 rosak sbb Vref 14.52volt,  sepatutnya dlm keadaan standby ianya 5volt saja.

     Ok sambung bahagian 2, ngantuk dah ni... apa-apa saya roger. 73 de 9m2zak

Saturday, January 18, 2025

GPS Monitoring : ESP32-DA Module

 


Percubaan untuk menghasilkan sebuah GPS monitoring berjaya. Projek ini saya gunakan : 

  1.  ESP32 Wroom
  2. GPS module GPS6MV2
  3. 2.4 oled lcd module SPI
  4. Expansion board

 setelah beberapa minit, rasanya tak sampai 5 minit, GPS saya trus lock dan hasilnya seperti di bawah.


di bawah ini saya sertkan skrip yang sudah banyak kali debug dan akhirnya sukses. have fun!!!

---------------------------------------------------------------------------------------------------------------

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TinyGPS++.h>

// Tetapan OLED
#define OLED_MOSI   21    
#define OLED_CLK    22    
#define OLED_DC     15    
#define OLED_CS     13    
#define OLED_RESET  14    
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Tetapan GPS
#define RXPin 16  // Sambungkan ke pin TX GPS
#define TXPin 17  // Sambungkan ke pin RX GPS
#define GPSBaud 9600
TinyGPSPlus gps;

void setup() {
  // Memulakan Serial Monitor
  Serial.begin(115200);
  Serial.println("GPS Monitor Starting...");

  // Memulakan sambungan GPS menggunakan UART bawaan
  Serial2.begin(GPSBaud, SERIAL_8N1, RXPin, TXPin);
 
  // Memulakan OLED SPI
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_RESET)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Berhenti jika OLED gagal
  }
  display.clearDisplay();
  display.setTextSize(1); // Saiz teks
  display.setTextColor(SSD1306_WHITE); // Warna teks
  display.setCursor(0, 0);
  display.println(F("GPS Monitor"));
  display.display();
  delay(2000);
}

void loop() {
  // Membaca data GPS dari Serial2
  while (Serial2.available() > 0) {
    char c = Serial2.read();
    if (gps.encode(c)) {
      displayGPSInfo(); // Paparkan maklumat GPS pada OLED
    }
  }
 
  // Debug di Serial Monitor
  if (millis() > 5000 && gps.charsProcessed() < 10) {
    Serial.println(F("Tiada isyarat GPS diterima."));
  }
}

void displayGPSInfo() {
  display.clearDisplay();
  display.setCursor(0, 0);
 
  if (gps.location.isValid()) {
    display.print(F("Lat: "));
    display.println(gps.location.lat(), 6);
    display.print(F("Lon: "));
    display.println(gps.location.lng(), 6);
    display.print(F("Alt: "));
    display.println(gps.altitude.meters());
    display.print(F("Sat: "));
    display.println(gps.satellites.value());
  } else {
    display.println(F("Mencari satelit..."));
  }
 
  display.display();
}


ESP32-WROOM : Jam azan


 Dibawah ini adalah scriptnya, semoga bermanfaat.

--------------------------------------------------------------------------------------------------------------------

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// Tetapan OLED
#define OLED_MOSI   21    
#define OLED_CLK    22    
#define OLED_DC     15    
#define OLED_CS     13    
#define OLED_RESET  14    
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Tetapan WiFi
const char* ssid = "XXXX";    // Ganti dengan SSID WiFi anda
const char* password = "XXXX"; // Ganti dengan kata laluan WiFi anda

// Tetapan NTP (Masa Internet)
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "sg.pool.ntp.org", 8 * 3600, 60000); // GMT+8

// Jadual waktu azan (untuk lokasi tertentu, ubah ikut lokasi anda)
struct PrayerTime {
  String name;
  int hour;
  int minute;
};

PrayerTime prayerTimes[] = {
  {"Subuh", 5, 45},
  {"Zohor", 13, 10},
  {"Asar", 16, 30},
  {"Maghrib", 19, 5},
  {"Isyak", 20, 15}
};
const int numPrayers = sizeof(prayerTimes) / sizeof(prayerTimes[0]);

void setup() {
  Serial.begin(115200);

  // Sambungkan WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi Connected");

  // Mulakan NTP
  timeClient.begin();

  // Mulakan OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("OLED initialization failed"));
    while (1);
  }
 
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);  // Saiz font kecil
  display.setCursor(0, 0);
  display.println("Jam Azan");
  display.println("Memuatkan...");
  display.display();
  delay(2000);
}

void loop() {
  // Kemas kini masa
  timeClient.update();

  // Dapatkan masa semasa
  int currentHour = timeClient.getHours();
  int currentMinute = timeClient.getMinutes();
  int currentSecond = timeClient.getSeconds();

  // Periksa waktu azan
  checkPrayerTime(currentHour, currentMinute);

  // Paparkan masa dan waktu solat
  displayTime(currentHour, currentMinute, currentSecond);
  delay(1000);
}

void checkPrayerTime(int hour, int minute) {
  for (int i = 0; i < numPrayers; i++) {
    if (hour == prayerTimes[i].hour && minute == prayerTimes[i].minute) {
      // Notifikasi azan (anda boleh sambung ke buzzer/speaker di sini)
      Serial.println("Waktu Azan: " + prayerTimes[i].name);
      playAzan();
    }
  }
}

void playAzan() {
  // Gantikan dengan kod untuk memainkan azan (buzzer atau audio file)
  Serial.println("Memainkan Azan...");
}

void displayTime(int hour, int minute, int second) {
  display.clearDisplay();
  display.setTextSize(1);  // Saiz font kecil
 
  display.setCursor(0, 0);

  // Paparkan masa semasa
  if (hour < 10) display.print("0");
  display.print(hour);
  display.print(":");
  if (minute < 10) display.print("0");
  display.print(minute);
  display.print(":");
  if (second < 10) display.print("0");
  display.print(second);

  // Tambahkan "9m2zak" pada hujung jam
  display.print(" 9m2zak");

  // Paparkan waktu solat
  display.setTextSize(1);  // Saiz font kecil
  display.setCursor(0, 20);  // Ubah kedudukan ke atas sedikit
  for (int i = 0; i < numPrayers; i++) {
    display.print(prayerTimes[i].name);
    display.print(": ");
    if (prayerTimes[i].hour < 10) display.print("0");
    display.print(prayerTimes[i].hour);
    display.print(":");
    if (prayerTimes[i].minute < 10) display.print("0");
    display.print(prayerTimes[i].minute);
    display.println();
  }

  display.display();
}

Friday, January 17, 2025

ESP32 WIFI Analyzer with OLED Display

Wifi Analyzer

Skrip dibawah  ini berfungsi untuk scan WiFi berdekatan dan memaparkan maklumatnya pada screen OLED. Fungsi utamanya ialah:

  1. Scan WiFi setiap 5 saat.
  2. Tunjuk maklumat rangkaian seperti:
    • Nama (SSID)
    • Kekuatan signal (RSSI dalam dBm)
    • Nombor channel (Channel)
    • Jenis (WPA2, WPA, Open, dll.)
    • Bar kekuatan isyarat.

Disini saya lampirkan skripnya.

-------------------------------------------------------------------------------------------------------------------

 #include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <WiFi.h>


#define OLED_MOSI   21    

#define OLED_CLK    22    

#define OLED_DC     15    

#define OLED_CS     13    

#define OLED_RESET  14    

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define BUTTON_NEXT 0     // Button for scrolling networks


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, 

  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


#define MAX_NETWORKS 20

int networkCount = 0;

int currentNetwork = 0;

const int scanTime = 5; // In seconds

unsigned long lastScan = 0;


struct WiFiNetwork {

  String ssid;

  int32_t rssi;

  wifi_auth_mode_t encryptionType;

  int channel;

};


WiFiNetwork networks[MAX_NETWORKS];


void setup() {

  Serial.begin(115200);

  pinMode(BUTTON_NEXT, INPUT_PULLUP);

  

  // Setup OLED

  if (!display.begin(SSD1306_SWITCHCAPVCC)) {

    Serial.println(F("OLED initialization failed"));

    while (1);

  }

  

  display.clearDisplay();

  display.setTextColor(SSD1306_WHITE);

  

  // Show initial message

  display.setTextSize(1);

  display.setCursor(0,0);

  display.println("WiFi Analyzer");

  display.println("Initializing...");

  display.display();

  

  // Setup WiFi

  WiFi.mode(WIFI_STA);

  WiFi.disconnect();

  delay(100);

}


void loop() {

  // Scan networks every 5 seconds

  if (millis() - lastScan >= scanTime * 1000) {

    scanNetworks();

    lastScan = millis();

  }

  

  // Change network when button is pressed

  if (digitalRead(BUTTON_NEXT) == LOW && networkCount > 0) {

    currentNetwork = (currentNetwork + 1) % networkCount;

    delay(200); // Debounce

    displayNetworks();

  }

}


void scanNetworks() {

  display.clearDisplay();

  display.setTextSize(1);

  display.setCursor(0,0);

  display.println("Scanning...");

  display.display();

  

  networkCount = WiFi.scanNetworks();

  

  if (networkCount == 0) {

    display.clearDisplay();

    display.setCursor(0,0);

    display.println("No networks found!");

    display.display();

  } else {

    networkCount = min(networkCount, MAX_NETWORKS);

    for (int i = 0; i < networkCount; i++) {

      networks[i].ssid = WiFi.SSID(i);

      networks[i].rssi = WiFi.RSSI(i);

      networks[i].encryptionType = WiFi.encryptionType(i);

      networks[i].channel = WiFi.channel(i);

    }

    displayNetworks();

  }

  

  // Clear scan results

  WiFi.scanDelete();

}


String getEncryptionTypeString(wifi_auth_mode_t encryptionType) {

  switch (encryptionType) {

    case WIFI_AUTH_OPEN:

      return "Open";

    case WIFI_AUTH_WEP:

      return "WEP";

    case WIFI_AUTH_WPA_PSK:

      return "WPA-PSK";

    case WIFI_AUTH_WPA2_PSK:

      return "WPA2-PSK";

    case WIFI_AUTH_WPA_WPA2_PSK:

      return "WPA/WPA2";

    case WIFI_AUTH_WPA2_ENTERPRISE:

      return "WPA2-ENT";

    default:

      return "Unknown";

  }

}


void displayNetworks() {

  display.clearDisplay();

  display.setTextSize(1);

  

  // Header

  display.setCursor(0,0);

  display.print(networkCount);

  display.print(" Networks | ");

  display.print(currentNetwork + 1);

  display.print("/");

  display.println(networkCount);

  display.drawLine(0, 9, SCREEN_WIDTH-1, 9, SSD1306_WHITE);

  

  if (networkCount > 0) {

    // Network SSID

    display.setCursor(0,12);

    String ssid = networks[currentNetwork].ssid;

    if (ssid.length() > 20) {

      ssid = ssid.substring(0, 17) + "...";

    }

    display.println(ssid);

    

    // Signal strength

    display.print("RSSI: ");

    display.print(networks[currentNetwork].rssi);

    display.println(" dBm");

    

    // Channel

    display.print("CH: ");

    display.println(networks[currentNetwork].channel);

    

    // Encryption type

    display.print("Security: ");

    display.println(getEncryptionTypeString(networks[currentNetwork].encryptionType));

    

    // Signal strength bar

    int strength = map(networks[currentNetwork].rssi, -100, -40, 0, SCREEN_WIDTH);

    display.drawRect(0, 54, SCREEN_WIDTH, 10, SSD1306_WHITE);

    display.fillRect(0, 54, strength, 10, SSD1306_WHITE);

  }

  

  display.display();

}

---------------------------------------------------------------------------------------------------------------------

semoga bermanfaat, 73 9m2zak


Install M5Stick-Launcher for Lilygo T-Deck

 Step 1 : Pergi ke github ini,   https://github.com/bmorcelli/M5Stick-Launcher/ kemudian klik pada release yang terkini, ada sebelah kanan s...