Wednesday, 4 November 2026

36Vdc -70Vdc to 12Vdc 15 Amps Convertor and Generator Starting Timer

 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.

Good FET deriving section where TLP250 were used,  

Fan will start run on high temperature, 


Actually, this circuit is for GSM BTS Sites where it will charge Generator battery from the BTS DC power system, another option also added where it will start the generator when BTS battery becomes low, and stopped when BTS batteries get charged .

LCD and button were added for the timer and battery voltage setting  

detail will be shared soon 










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

        1. Power Transistors (MJE13007 / MJE13009):

        These high-voltage NPN transistors act as the main series-pass power elements.

    1. 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).

    2. 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:

  1. IRF3205 N-Channel Power MOSFET

  2. 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.

here TP4056 Module battery +ve and out +ve are common











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)


Buck converter 30-70 Volts to 12 Volts -24 Volts

A simple buck converter circuit which gives constant voltage with input voltages up 70 volt dc 

IRF3808 FET with UA3845 IC


         Visit YouTube:




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

  1. Initial Link: User selects the Bluetooth module once using a ListPicker.

  2. Save MAC: On successful connection, the app stores the module's MAC address in TinyDB.

  3. 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" from TinyDB. If present, call BluetoothClient.Connect using that address.

  • ListPicker.BeforePicking: Set ListPicker.Elements to BluetoothClient.AddressesAndNames.

  • ListPicker.AfterPicking: Connect to ListPicker.Selection. On success, save ListPicker.Selection to TinyDB under 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

  1. Micro USB TP4056 Lithium Battery 18650 Charger Module 1A 3.7V
  2. GSM Module
  3. General Mobile set Battery 
  4. 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 



No enrolment or reading 

complete sketch, 

there is much difference found in sensor wiring,


 
 

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 & PinArduino PinDescription
Fingerprint Sensor (TX)Pin 2Connects to Sensor RX
Fingerprint Sensor (RX)Pin 3Connects to Sensor TX
Fingerprint Sensor (VCC)5VPower Supply
Fingerprint Sensor (GND)GNDGround
Buzzer (+)Pin 5Buzzer Control Output
Match ButtonPin 4Push button to manual match (Fixed conflict)
Indicator LED (indFinger)Pin 7Finger ready status LED
Register / Back ButtonA0 (Pin 14)Push button with internal pull-up
Delete / OK ButtonA1 (Pin 15)Push button with internal pull-up
Forward ButtonPin 2 (A2) / A2 (Pin 16)Push button with internal pull-up
Reverse ButtonA3 (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 0x3F to 0x27 in LiquidCrystal_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.

C++
#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(" ");
}