36Vdc -70Vdc to 12Vdc 15 Amps Convertor circuit, this project is for 12v 100Ah battery from 48vdc,
this project is based on Atmega328, this project will provide fixed 15 Amps for Battery Charging, with fixed 13.8 volt charging volt, and having a very good battery current cutoff option.My this blog is purely for educational purpose , the aim is to introduce some unique ideas for electronic circuits enthusiasts, students hobbyist............. . My Youtube Channel : https://www.youtube.com/channel/UCo9zgx6UXdhBhpF51f5JjDw
Wednesday, 4 November 2026
36Vdc -70Vdc to 12Vdc 15 Amps Convertor and Generator Starting Timer
Monday, 26 October 2026
100Vdc to 5Vdc 3 Amps Convertor ( Transistors Base)
100 VDC to 5 VDC (3A) Transistor-Based Step-Down Converter
Project Overview
This is a reliable, transistor-based linear step-down DC-DC converter designed to step down a high-voltage direct current input of 100 VDC to a stable 5 VDC output capable of delivering up to 3 Amps of current.
Key Specifications
Input Voltage: 100 VDC
Intermediate Voltage: ~15 VDC (pre-regulated stage)
Output Voltage: 5 VDC
Max Output Current: 3 A
Key Components & Working Principle
Power Transistors (MJE13007 / MJE13009):
These high-voltage NPN transistors act as the main series-pass power elements.
Zener Diode Stage:
Zener diodes are utilized to establish a stable reference voltage and help stabilize the intermediate voltage stage (bringing the high input voltage down closer to a manageable ~15 VDC).
Voltage Regulator IC (7805):
The intermediate ~15 VDC output from the transistor/Zener stage is fed into a standard 7805 linear regulator IC, which cleanly steps it down to the final, stable 5 VDC output required for your load.
Circuit Advantages
High-Voltage Handling: Efficiently bridges a wide voltage gap safely using robust high-voltage transistors.
Stable Output: The two-stage reduction (transistor/Zener pre-regulator followed by the 7805 IC) ensures a clean and steady 5V output.
Reliability: Built with heavy-duty components designed to handle high thermal loads when properly paired with heatsinks.
Saturday, 24 October 2026
TP4056 Module modification up to 5 Amperes (3.7V ,5 Amps)
Smart & Compact TP4056 Lithium Battery Charger Modification (Up to 5 Amps)
By default, the popular TP4056 charging module is limited to around 1A of charging current. If you want to scale up your charging capacity for larger battery banks without bulky hardware, here is a smart, compact, and cost-effective modification to boost the TP4056 charging output up to 5 Amps.
Required Components
You only need two standard components for this upgrade:
IRF3205 N-Channel Power MOSFET
1K Resistor (1/4W)
Wiring & Connection Guide
To integrate the external MOSFET and scale up the current capability:
Gate Connection: Connect the 1K resistor from Pin 7 (PROG) of the TP4056 IC directly to the Gate of the IRF3205 MOSFET.
Power Path: Configure the IRF3205 to handle the high-current charging path from your input source to the battery, allowing the TP4056 to act as the intelligent control driver while the external MOSFET handles the heavy current load.
Wednesday, 12 August 2026
Hybrid MPPT Solar Charge Controller
My new Hybrid MPPT Solar Charge Controller project
Input Working Voltages from 20vdc to 80vdc, will be capable to charge both 12 and 24v Battery,
with full hybrid functions also with Wi-Fi base dashboard
Sunday, 1 December 2024
Buck converter 30-70 Volts to 12Volts -24Volts (UA3845)
Sunday, 10 November 2024
Bluetooth auto connect in MIT App
Bluetooth Auto-Connect in MIT App Inventor
When building Arduino, ESP32, or IoT hardware projects, selecting your Bluetooth module manually every time you open your app gets repetitive. By storing your device's MAC address in TinyDB, your app can auto-connect instantly on launch.
🛠️ How It Works
Initial Link: User selects the Bluetooth module once using a
ListPicker.Save MAC: On successful connection, the app stores the module's MAC address in
TinyDB.Auto-Reconnect: On
Screen1.Initialize, the app retrieves the address and automatically connects in the background.
📱 Required Components
BluetoothClient(Connectivity)ListPicker(For first-time device selection)TinyDB(Storage — to save the MAC address)
🧩 Block Logic Overview
Screen1.Initialize: Read saved tag"BT_Address"fromTinyDB. If present, callBluetoothClient.Connectusing that address.ListPicker.BeforePicking: SetListPicker.ElementstoBluetoothClient.AddressesAndNames.ListPicker.AfterPicking: Connect toListPicker.Selection. On success, saveListPicker.SelectiontoTinyDBunder tag"BT_Address".
Sunday, 10 December 2023
Sim800l Module Power Supply
Beside of very good and cheap Sim800l module , it is very hard to manage perfect power supply which it maintain the required voltage for th module.
Though it required up to 2 Amps at max burst , but it will work fine here , capacitor will add more power stability to the module
Battery will be also keep charging here, there is also cutoff circuit inside battery ,
you donot have the over charging issue for battery
It will maintain power for SSim module while any interruption in input
- Micro USB TP4056 Lithium Battery 18650 Charger Module 1A 3.7V
- GSM Module
- General Mobile set Battery
- 1000uf 6.3v Capacitor
Tuesday, 25 July 2023
AVRDUDESS + Arduino Atmega16 & Atmega8 programming
Arduino Atmega16 programming ,
Before programing arduino as ISP should be uploaded ,
then use avrduddess for HEX uploading , no crystal used in Atmega16 case , some time it required 16MHz Crystal
Crystal will be used in case of Atmega8
Arduino Pin 13 ke ATMega16 Pin 8 (or SCK of another microcontroller)
Arduino Pin 12 ke ATMega16 Pin 7 (or MISO of another microcontroller)
Arduino Pin 11 ke ATMega16 Pin 6 (or MOSI of another microcontroller)
Arduino Pin 10 ke ATMega16 Pin 9 (or RESET of another microcontroller)
Arduino 5+ to ATMega16 Pin 10 (or Vcc of another microcontroller)
Arduino Gnd to ATMega 16 Pin 11 ()
![]() |
Thursday, 2 March 2023
Capacitive Fingerprint Sensor With Arduino
Capacitive Fingerprint Sensor With Arduino
1. Wiring Guide (Arduino Uno / Nano)
The major issue causing communication or runtime errors in these projects is usually pin conflicts (such as assigning the same pin to both a buzzer and a button) and incorrect UART cross-connections.
| Component & Pin | Arduino Pin | Description |
| Fingerprint Sensor (TX) | Pin 2 | Connects to Sensor RX |
| Fingerprint Sensor (RX) | Pin 3 | Connects to Sensor TX |
| Fingerprint Sensor (VCC) | 5V | Power Supply |
| Fingerprint Sensor (GND) | GND | Ground |
| Buzzer (+) | Pin 5 | Buzzer Control Output |
| Match Button | Pin 4 | Push button to manual match (Fixed conflict) |
Indicator LED (indFinger) | Pin 7 | Finger ready status LED |
| Register / Back Button | A0 (Pin 14) | Push button with internal pull-up |
| Delete / OK Button | A1 (Pin 15) | Push button with internal pull-up |
| Forward Button | Pin 2 (A2) / A2 (Pin 16) | Push button with internal pull-up |
| Reverse Button | A3 (Pin 17) | Push button with internal pull-up |
| RTC & LCD (SDA) | A4 (SDA) | Shared I2C Data line |
| RTC & LCD (SCL) | A5 (SCL) | Shared I2C Clock line |
Note on I2C LCD Address: If your LCD display remains blank, change
0x3Fto0x27inLiquidCrystal_I2C lcd(0x3F, 16, 2);.
2. Corrected Complete Sketch
The code below resolves the pin conflict on Pin 5 (which was shared by both the buzzer and the match input), fixes the overlapping EEPROM memory blocks for users, and cleans up syntax issues.
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include "Adafruit_Fingerprint.h"
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include "RTClib.h"
// Initialize I2C LCD (Change 0x3F to 0x27 if screen doesn't turn on)
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// Software Serial for Fingerprint Sensor (Arduino RX, TX)
SoftwareSerial fingerPrint(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerPrint);
// RTC Module
RTC_DS3231 rtc;
// Pin Definitions (Pin 5 conflict resolved: Match moved to Pin 4)
#define register_back 14 // A0
#define delete_ok 15 // A1
#define forward 16 // A2
#define reverse 17 // A3
#define match 4 // Moved from Pin 5 to Pin 4
#define buzzer 5 // Pin 5 dedicated to Buzzer
#define indFinger 7 // LED Indicator
#define records 10 // Total user capacity
int user1, user2, user3, user4, user5, user6, user7, user8, user9, user10;
DateTime now;
void setup() {
delay(1000);
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(register_back, INPUT_PULLUP);
pinMode(forward, INPUT_PULLUP);
pinMode(reverse, INPUT_PULLUP);
pinMode(delete_ok, INPUT_PULLUP);
pinMode(match, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
pinMode(indFinger, OUTPUT);
digitalWrite(buzzer, LOW);
// Download Data Mode via Register Button on Startup
if (digitalRead(register_back) == 0) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
lcd.clear();
lcd.print("Please wait !");
lcd.setCursor(0, 1);
lcd.print("Downloading Data");
Serial.println("Please wait");
Serial.println("Downloading Data..");
Serial.println();
Serial.print("S.No. ");
for (int i = 0; i < records; i++) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
Serial.print(" User ID");
Serial.print(i + 1);
Serial.print(" ");
}
Serial.println();
int eepIndex = 0;
for (int i = 0; i < 30; i++) {
if (i + 1 < 10) Serial.print('0');
Serial.print(i + 1);
Serial.print(" ");
for (int block = 0; block < 10; block++) {
eepIndex = (i * 7) + (block * 210);
download(eepIndex);
}
Serial.println();
}
}
// System Reset Mode via Delete Button on Startup
if (digitalRead(delete_ok) == 0) {
lcd.clear();
lcd.print("Please Wait");
lcd.setCursor(0, 1);
lcd.print("Resetting.....");
for (int i = 1000; i < 1010; i++) EEPROM.write(i, 0);
for (int i = 0; i < 2100; i++) EEPROM.write(i, 0xff);
lcd.clear();
lcd.print("System Reset");
delay(1000);
}
lcd.clear();
lcd.print(" Fingerprint ");
lcd.setCursor(0, 1);
lcd.print("Attendance System");
delay(2000);
lcd.clear();
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
for (int i = 1000; i < 1000 + records; i++) {
if (EEPROM.read(i) == 0xff)
EEPROM.write(i, 0);
}
finger.begin(57600);
lcd.clear();
lcd.print("Finding Module..");
lcd.setCursor(0, 1);
delay(2000);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
lcd.clear();
lcd.print(" Module Found");
delay(2000);
} else {
Serial.println("Did not find fingerprint sensor :(");
lcd.clear();
lcd.print("Module Not Found");
lcd.setCursor(0, 1);
lcd.print("Check Connections");
while (1);
}
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (rtc.lostPower()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(2026, 10, 24, 11, 0, 0)); // Default fallback time
}
lcd.setCursor(0, 0);
lcd.print(" System Ready ");
delay(2000);
user1 = EEPROM.read(1000);
user2 = EEPROM.read(1001);
user3 = EEPROM.read(1002);
user4 = EEPROM.read(1003);
user5 = EEPROM.read(1004);
lcd.clear();
digitalWrite(indFinger, HIGH);
}
void loop() {
now = rtc.now();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Date: ");
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(" ");
delay(500);
int result = getFingerprintIDez();
if (result > 0) {
digitalWrite(indFinger, LOW);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
lcd.clear();
lcd.print("ID:");
lcd.print(result);
lcd.setCursor(0, 1);
lcd.print("Please Wait....");
delay(1000);
attendance(result);
lcd.clear();
lcd.print("Attendance ");
lcd.setCursor(0, 1);
lcd.print("Registered");
delay(1000);
digitalWrite(indFinger, HIGH);
return;
}
checkKeys();
delay(300);
}
void attendance(int id) {
int user = 0, eepLoc = 0;
if (id == 1) { eepLoc = 0; user = user1++; }
else if (id == 2) { eepLoc = 210; user = user2++; }
else if (id == 3) { eepLoc = 420; user = user3++; }
else if (id == 4) { eepLoc = 630; user = user4++; }
else if (id == 5) { eepLoc = 840; user = user5++; }
else if (id == 6) { eepLoc = 1050; user = user6++; }
else if (id == 7) { eepLoc = 1260; user = user7++; }
else if (id == 8) { eepLoc = 1470; user = user8++; }
else if (id == 9) { eepLoc = 1680; user = user9++; }
else if (id == 10){ eepLoc = 1890; user = user10++; }
else return;
int eepIndex = (user * 7) + eepLoc;
EEPROM.write(eepIndex++, now.hour());
EEPROM.write(eepIndex++, now.minute());
EEPROM.write(eepIndex++, now.second());
EEPROM.write(eepIndex++, now.day());
EEPROM.write(eepIndex++, now.month());
EEPROM.write(eepIndex++, now.year() >> 8);
EEPROM.write(eepIndex++, now.year());
EEPROM.write(1000, user1);
EEPROM.write(1001, user2);
EEPROM.write(1002, user3);
EEPROM.write(1003, user4);
EEPROM.write(1004, user5);
}
void checkKeys() {
if (digitalRead(register_back) == 0) {
lcd.clear();
lcd.print("Please Wait");
delay(1000);
while (digitalRead(register_back) == 0);
Enroll();
} else if (digitalRead(delete_ok) == 0) {
lcd.clear();
lcd.print("Please Wait");
delay(1000);
delet();
}
}
void Enroll() {
int count = 1;
lcd.clear();
lcd.print("Enter Finger ID:");
while (1) {
lcd.setCursor(0, 1);
lcd.print(count);
if (digitalRead(forward) == 0) {
count++;
if (count > records) count = 1;
delay(500);
} else if (digitalRead(reverse) == 0) {
count--;
if (count < 1) count = records;
delay(500);
} else if (digitalRead(delete_ok) == 0) {
id = count;
getFingerprintEnroll();
return;
} else if (digitalRead(register_back) == 0) {
return;
}
}
}
void delet() {
int count = 1;
lcd.clear();
lcd.print("Enter Finger ID");
while (1) {
lcd.setCursor(0, 1);
lcd.print(count);
if (digitalRead(forward) == 0) {
count++;
if (count > records) count = 1;
delay(500);
} else if (digitalRead(reverse) == 0) {
count--;
if (count < 1) count = records;
delay(500);
} else if (digitalRead(delete_ok) == 0) {
id = count;
deleteFingerprint(id);
return;
} else if (digitalRead(register_back) == 0) {
return;
}
}
}
uint8_t getFingerprintEnroll() {
int p = -1;
lcd.clear();
lcd.print("finger ID:");
lcd.print(id);
lcd.setCursor(0, 1);
lcd.print("Place Finger");
delay(2000);
while (p != FINGERPRINT_OK) {
p = finger.getImage();
}
p = finger.image2Tz(1);
if (p != FINGERPRINT_OK) return p;
lcd.clear();
lcd.print("Remove Finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
lcd.clear();
lcd.print("Place Again");
p = -1;
while (p != FINGERPRINT_OK) {
p = finger.getImage();
}
p = finger.image2Tz(2);
if (p != FINGERPRINT_OK) return p;
p = finger.createModel();
if (p != FINGERPRINT_OK) return p;
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
lcd.clear();
lcd.print(" Finger Stored!");
delay(2000);
}
return p;
}
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) {
return -1;
}
return finger.fingerID;
}
uint8_t deleteFingerprint(uint8_t id) {
uint8_t p = finger.deleteModel(id);
if (p == FINGERPRINT_OK) {
lcd.clear();
lcd.print("Finger Deleted");
delay(1000);
} else {
lcd.clear();
lcd.print("Delete Failed");
delay(2000);
}
return p;
}
void download(int eepIndex) {
if (EEPROM.read(eepIndex) != 0xff) {
Serial.print("T->");
if (EEPROM.read(eepIndex) < 10) Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print(':');
if (EEPROM.read(eepIndex) < 10) Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print(':');
if (EEPROM.read(eepIndex) < 10) Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print(" D->");
if (EEPROM.read(eepIndex) < 10) Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print('/');
if (EEPROM.read(eepIndex) < 10) Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print('/');
Serial.print(EEPROM.read(eepIndex++) << 8 | EEPROM.read(eepIndex++));
} else {
Serial.print("---------------------------");
}
Serial.print(" ");
}















.jpeg)








