Semoga bermanfaat 73 de 9m2zak. |
"Bacalah (wahai Muhammad) dengan nama Tuhanmu yang menciptakan (sekalian makhluk). Ia menciptakan manusia dari sebuku darah beku; Bacalah, dan Tuhanmu Yang Maha Pemurah, Yang mengajar manusia melalui pena dan tulisan, Ia mengajarkan manusia apa yang tidak diketahuinya." (Al'Alaq: 1-5)
Wednesday, February 12, 2025
Saturday, February 1, 2025
Power Transistor MJ11016G short
![]() |
MJ11016G |
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
Analisis Bacaan Pin TL494
- Pin 1 (Error Amplifier Input 1): 2.474V - Bacaan ini adalah normal.
- Pin 2 (Error Amplifier Input 2): 2.474V - Bacaan ini sepadan dengan Pin 1. tiada masalah
- 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
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 :
- ESP32 Wroom
- GPS module GPS6MV2
- 2.4 oled lcd module SPI
- 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!!!
---------------------------------------------------------------------------------------------------------------
ESP32-WROOM : Jam azan
Dibawah ini adalah scriptnya, semoga bermanfaat.
--------------------------------------------------------------------------------------------------------------------
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:
- Scan WiFi setiap 5 saat.
- 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
Monday, January 13, 2025
Space Shooter Game Lilygo TTGO ESP32
Untuk bermain permainan ini, korang memerlukan 2 butang untuk mengawal pesawat angkasa.
Manakala tembakannya adalah auto, so kita hanya perlu kawal sahaja.
Untuk sambung 2 butang kawalan kiri kanan tu,
- sambung butang ke pin GPIO0 (kiri) dan GPIO35 (kanan)
dan pastikan kedua-dua butang itu di gnd kan. Dalam video di bawah saya tiada butang tu.
Maka saya tap sajalah... hahahaha.
jika berminat, dibawah ini adalah scriptnya. have fun!!!.
-------------------------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.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_LEFT 0 // Butang kiri (GPIO0)
#define BUTTON_RIGHT 35 // Butang kanan (GPIO35)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
// Struktur untuk pesawat pemain
struct Player {
int x = SCREEN_WIDTH/2;
int y = SCREEN_HEIGHT-10;
int width = 8;
int height = 8;
int score = 0;
int lives = 3;
};
// Struktur untuk peluru
struct Bullet {
int x = -1;
int y = -1;
bool active = false;
};
// Struktur untuk musuh
struct Enemy {
int x;
int y;
bool active = false;
};
Player player;
Bullet bullet;
Enemy enemies[3];
unsigned long lastEnemySpawn = 0;
unsigned long lastBulletFired = 0;
void setup() {
Serial.begin(115200);
// Setup butang
pinMode(BUTTON_LEFT, INPUT_PULLUP);
pinMode(BUTTON_RIGHT, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("OLED initialization failed"));
while (1);
}
// Mulakan permainan
initGame();
}
void initGame() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Reset kedudukan musuh
for(int i = 0; i < 3; i++) {
enemies[i].active = false;
}
// Reset pemain
player.x = SCREEN_WIDTH/2;
player.score = 0;
player.lives = 3;
}
void loop() {
// Baca input
handleInput();
// Update game state
updateGame();
// Lukis skrin
drawGame();
delay(50);
}
void handleInput() {
// Gerakkan pemain ke kiri
if(digitalRead(BUTTON_LEFT) == LOW) {
player.x = max(player.width/2, player.x - 2);
}
// Gerakkan pemain ke kanan
if(digitalRead(BUTTON_RIGHT) == LOW) {
player.x = min(SCREEN_WIDTH - player.width/2, player.x + 2);
}
// Tembak peluru (automatik)
if(!bullet.active && millis() - lastBulletFired > 500) {
bullet.x = player.x;
bullet.y = player.y - 5;
bullet.active = true;
lastBulletFired = millis();
}
}
void updateGame() {
// Update peluru
if(bullet.active) {
bullet.y -= 3;
if(bullet.y < 0) bullet.active = false;
}
// Spawn musuh baharu
if(millis() - lastEnemySpawn > 2000) {
for(int i = 0; i < 3; i++) {
if(!enemies[i].active) {
enemies[i].x = random(10, SCREEN_WIDTH-10);
enemies[i].y = 0;
enemies[i].active = true;
lastEnemySpawn = millis();
break;
}
}
}
// Update musuh
for(int i = 0; i < 3; i++) {
if(enemies[i].active) {
enemies[i].y += 1;
// Periksa perlanggaran dengan peluru
if(bullet.active &&
abs(bullet.x - enemies[i].x) < 8 &&
abs(bullet.y - enemies[i].y) < 8) {
enemies[i].active = false;
bullet.active = false;
player.score += 10;
}
// Periksa perlanggaran dengan pemain
if(abs(enemies[i].x - player.x) < 8 &&
abs(enemies[i].y - player.y) < 8) {
enemies[i].active = false;
player.lives--;
if(player.lives <= 0) {
initGame();
return;
}
}
// Reset musuh jika keluar skrin
if(enemies[i].y > SCREEN_HEIGHT) {
enemies[i].active = false;
}
}
}
}
void drawGame() {
display.clearDisplay();
// Lukis pemain
display.fillTriangle(
player.x, player.y - 4,
player.x - 4, player.y + 4,
player.x + 4, player.y + 4,
SSD1306_WHITE);
// Lukis peluru
if(bullet.active) {
display.drawPixel(bullet.x, bullet.y, SSD1306_WHITE);
}
// Lukis musuh
for(int i = 0; i < 3; i++) {
if(enemies[i].active) {
display.drawRect(enemies[i].x - 4, enemies[i].y - 4, 8, 8, SSD1306_WHITE);
}
}
// Papar skor dan nyawa
display.setCursor(0,0);
display.print("Score:");
display.print(player.score);
display.setCursor(SCREEN_WIDTH-30,0);
for(int i = 0; i < player.lives; i++) {
display.print("<3 ");
}
display.display();
}
-------------------------------------------------------------------------------------------------------------------------
Sunday, January 12, 2025
Lora APRS Igate setup
![]() |
Lora Aprs Igate 9W2DCW-10 |
Pergi ke laman web ini untuk flash firmware Lora APRS Igate, link seperti di bawah.
https://richonguzman.github.io/lora-igate-web-flasher/installer.html
kemudian paparan ini akan kelihatan.
pada baris atas iaitu Board (enviroment) pilih board yang sesuai dengan board yang ada pada kita,
pada saya ada board LILYGO TTGO Lora32 V1.6.1 seperti gambar di bawah.
V1.6.1 |
kemudian tekan Flash Firmware dalam kotak hijau tu dan paparan ini akan muncul.
pilih port USB Single Serial tu dan tekan connect
paparan ini akan muncul dan klik Install ttgo-lora32-v21 factory.json. kemudian paparan dibawah akan muncul dan tick erase device dan tekan next.
kemudian paparan diatas akan muncul dan tick erase device dan tekan next.
kemudian paparan dibawah akan muncul dan klik install.
tunggu sehingga dia selesai spt dibawah
sehinggalah keluar gambar ini.
dan selesai, anda boleh tutup web flasher ini dan jom ke langkah 2
Langkah 2
Dalam langkah 2 ini kita akan connect atau link-kan Lilygo kita dengan komputer untuk masuk ke dalamnya untuk proses setting. Cara untuk masuk ke dalam Lilygo ini adalah dengan menggunakan wifi.
cari SSID NOCALL-10-AP dan masuk, passwordnya ialah 1234567890
kemudian buka browser anda, dan taip IP 192.168.4.1. dimana saya dapat IP ini? saya dapat dengan melihatnya di screen LILYGO tersebut.
pada browser anda taip IP tersebut. seperti di bawah.
Station |
wifi APRS-IS |
Beaconing
Black list dan Digipeating
LORA, ubah freq ke 433.400
kemudian tekan button save warna hijau tu dan siaplah... untuk pastikan samada jadi ke, sila tgk di aprs.fi. jika jadi akan keluar macam ni.
Igate Lora akan papar simbol L latarbelakang merah. dan pada screen Lilygo anda akan terpapar seperti ini. lihat bawah.
Monday, January 6, 2025
Meshtastic Setup
Meshtastic setup : Flash board anda disini dahulu : https://flasher.meshtastic.org/ kemudian
Pastikan lilygo/tbeam/heltec/tdeck anda connect dengan bluetooth di telefon
anda terlebih dahulu. Download dahulu apps meshtastic di google play (android) atau app store (apple).
Pada apps Meshtastic, terus klik Setting dan setup 3 perkara ini iaitu Lora, Channels dan MQTT.
---------------------------------------------------------------------------------------------------------------------------------------------
Lora
Modem preset = LONG_FAST
Frequency offset (MHz) = 0.0
Region (Frequency plan) = Malaysia 919MHz
Hop Limit = 3
TX enabled = True
TX power (dBm) = 27
Frequency slot = 16
Override Duty Cycle = False
SX126X RX boosted gain = True
Override frequency (MHz) = 922.875
Ignore MQTT = False
OK to MQTT = True
MQTT
MQTT Config
MQTT enabled = True
Address = mqtt.lucifernet.com
Username = meshdev
Password = large4cats
Encrytion enabled = True
JSON output enabled = False
TLS enabled = False
Root topic = msh/MY_919
Proxy to client enabled = False jika guna wifi, True jika guna Bluetooth
Map Reporting = True
Precise location = True
Map reporting interval (seconds) = 0
Channel
Channels name = LongFast
PSK = AQ==
Uplink enabled = True
Downlink enabled = True
Position enabled = True
Precise location = True
-
Johor : 118.150 Subang : 118.200 Penang : 121.100 Terengganu ...
-
Langkah pertama yang perlu dan wajib anda lakukan adalah dengan mendapatkan DMR ID. DMR ID DMR ID pula lebih tepat dirujuk sebagai penge...