The Alpha Geek – Geeking Out

DFRobot

1 2 3 5

Project #30 – UNIHIKER – AHT20 – Mk09

——

#DonLucElectronics #DonLuc #AHT20 #UNIHIKER #Display #IoT #Project #DFRobot #Fritzing #Programming #Electronics #Microcontrollers #Consultant

——

AHT20

——

AHT20

——

AHT20

——

AHT20 – Temperature and Humidity Sensor

The AHT20 is a high-precision but low-cost temperature and humidity sensor, which is equipped with an improved MEMS semiconductor capacitive humidity sensor element. It features standard I2C interface and a wide voltage supply of 2 Volt – 5 Volt. And with simple peripheral circuit, it performs stably even in harsh environments in the measuring range of -40 – +85 Celsius. This sensor can be widely used for measuring the environmental temperature and humidity of home electronic equipment, the temperature and humidity of automobiles and so on.

DL2504Mk03

1 x UNIHIKER K10
1 x Lithium Ion Battery – 1000mAh
1 x Switch
1 x USB 3.1 Cable A to C

DL2504Mk03p

DL2504Mk03p.mp

/****** Don Luc Electronics © ******
Software Version Information
Project #30 - UNIHIKER - AHT20 - Mk09
DL2504Mk03p.mp
DL2504Mk03
1 x UNIHIKER K10
1 x Lithium Ion Battery - 1000mAh
1 x Switch
1 x USB 3.1 Cable A to C
*/

// Include the Library Code
// Unihiker K10
#include "unihiker_k10.h"
// Arduino Image Cache
#include "arduino_image_cache.h"

// Create an object
// UNIHIKER K10
UNIHIKER_K10 k10;
// Screen
uint8_t screen_dir=2;
// AHT20
AHT20 aht20;

// Software Version Information 30-09
// Main program start
void setup() {
	
  // Begin
  k10.begin();
  // Init Screen
  k10.initScreen(screen_dir);
  // Canvas
  k10.creatCanvas();

}
// Loop
void loop() {

  // Draw Bitmap
  k10.canvas->canvasDrawBitmap(0,0,240,320,image_data1);
  // Text TEMPERATURE (C)
  k10.canvas->canvasText("TEMPERATURE (C)", 6, 0x330000);
  // Text AHT20 TempC
  k10.canvas->canvasText(aht20.getData(AHT20::eAHT20TempC), 7, 0x0000FF);
  // Text HUMIDITY
  k10.canvas->canvasText("HUMIDITY", 8, 0x330000);
  // Text AHT20 HumiRH
  k10.canvas->canvasText(aht20.getData(AHT20::eAHT20HumiRH), 9, 0x0000FF);
  // Update Canvas
  k10.canvas->updateCanvas();

}

——

People can contact us: https://www.donluc.com/?page_id=1927

Electronics, IoT, Teacher, Instructor, R&D and Consulting

  • Programming Language
  • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
  • IoT
  • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
  • Robotics
  • Automation
  • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
  • Unmanned Vehicles Terrestrial and Marine
  • Machine Learning
  • Artificial Intelligence (AI)
  • RTOS
  • Sensors, eHealth Sensors, Biosensor, and Biometric
  • Research & Development (R & D)
  • Consulting

Follow Us

Luc Paquin – Curriculum Vitae – 2024
https://www.donluc.com/luc/

Web: https://www.donluc.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/@thesass2063
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Patreon: https://patreon.com/DonLucElectronics59
DFRobot: https://learn.dfrobot.com/user-10186.html
Hackster.io: https://www.hackster.io/neosteam-labs
Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
TikTok: https://www.tiktok.com/@luc.paquin8
Twitch: https://www.twitch.tv/lucpaquin
Hackster: https://www.hackster.io/luc-paquin
LinkedIn: https://www.linkedin.com/in/jlucpaquin/

Don Luc

Project #30 – UNIHIKER – UNIHIKER K10 – Mk08

——

#DonLucElectronics #DonLuc #UNIHIKER #Display #IoT #Project #DFRobot #Fritzing #Programming #Electronics #Microcontrollers #Consultant

——

UNIHIKER K10

——

UNIHIKER K10

——

UNIHIKER K10

Mindplus or MicroPython or Arduino IDE

UNIHIKER K10 is an AI learning device designed for education, serving as STEM AI kit and TinyML education kit for teens. It integrates a 2.8-inch color screen, Wi-Fi, Bluetooth, a camera, microphone, speaker, RGB light, temperature sensor, humidity sensor, light sensor, and accelerometer. Featuring edge connectors and Gravity IO interfaces, it enables the connection and control of various digital, analog, I2C, and UART sensors and actuators, making it perfect for IoT programming for beginners.

With its rich onboard resources, the UNIHIKER K10 eliminates the need for additional devices during learning and project development. It supports sensor control, IoT applications, and AI projects such as face detection and offline voice recognition, all in one compact device.

Core

  • MCU Module: ESP32-S3 N16R8
  • Processor:Xtensa® LX7
  • Dual core 32-bit up to 240 MHz
  • SRAM: 512KB
  • ROM: 384KB
  • Flash: 16MB
  • PSRAM: 8MB
  • RTC SRAM: 16KB
  • Wi-Fi Specification: IEEE 802.11b/g/n
  • Frequency: 2.4G
  • Band width: 20MHz, 40MHz
  • Bluetooth Specification: Bluetooth 5, Bluetooth mesh
  • Frequency: 125 Kbps, 500 Kbps, 1 Mbps, 2 Mbps

On-Board Component

  • Temperature and Humidity Sensor (AHT20)
  • Ambient Light Sensor (LTR303ALS)
  • Triaxial Acceleration Sensor (SC7A20H)
  • Display 2.8 inch, 240 x 320, Colored, LCD, (ILI9341)
  • Camera 2MP, 80°FOV, (GC2145)
  • A, B, RST,BOOT button A, B, RST,BOOT button
  • MEMS MIC, MEMS MIC x 2
  • Speaker Power, 2W
  • WS2812 RGB LED WS2812 RGB LED x 3

Interface

  • On-board interface USB-C power/program upload interface
  • 2 Pin PH2.0 battery
  • 3 Pin PH2.0 Full function GPIO x 2
  • 4 Pin PH2.0 I2C
  • Self-ejecting TF card slot
  • EdgeConnector Full function GPIO x 2
  • I2C x 1
  • Digital IO x 15
  • DL2504Mk02

    1 x UNIHIKER K10
    1 x USB Battery Pack
    1 x USB 3.1 Cable A to C

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consulting

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2024
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    Hackster: https://www.hackster.io/luc-paquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #25 – Movement – SD – Mk12

    ——

    #DonLucElectronics #DonLuc #SD #GPS #RTC #EEPROM #Compass #Accelerometer #Movement #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    SD

    ——

    SD

    ——

    SD

    ——

    MicroSD Card Module

    There are different microSD card modules compatible with the ESP32. We’re using the microSD card module it communicates using SPI communication protocol. You can use any other microSD card module with an SPI interface. This microSD card module is also compatible with other microcontrollers like the Arduino boards. To learn how to use the microSD card module with the Arduino. You can connect it to the ESP32 using the default SPI pins.

    DL2502Mk05

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail – I2C Hub 2.0
    1 x Crowtail – Switch 2.0
    1 x Adafruit MicroSD card breakout board+
    1 x MicroSD 4 GB
    1 x Crowtail – LED(Red)
    1 x GPS Receiver – GP-20U7
    1 x Adafruit DS3231 Precision RTC FeatherWing
    1 x CR1220 Battery
    1 x Crowtail – 3-Axis Digital Compass
    1 x Crowtail – 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    SCL – 22
    SDA – 21
    SCK – 18
    MOSI – 23
    MISO – 19
    CS – 4
    POT – 16
    LED – 17
    GPR – 0
    GPT – 2
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    DL2502Mk05p

    DL2502Mk05p.ino

    /****** Don Luc Electronics © ******
      Software Version Information
      Project #25 - Movement - SD - Mk12
      25-12
      DL2502Mk05p.ino
      DL2502Mk05
      1 x DFRobot FireBeetle 2 ESP32-E
      1 x Fermion: 2.0" 320x240 IPS TFT LCD
      1 x GDL Line 10 CM
      1 x Crowtail - I2C Hub 2.0
      1 x Crowtail - Switch 2.0
      1 x Adafruit MicroSD card breakout board+
      1 x MicroSD 4 GB
      1 x Crowtail - LED(Red)
      1 x GPS Receiver - GP-20U7
      1 x Adafruit DS3231 Precision RTC FeatherWing
      1 x CR1220 Battery
      1 x Crowtail - 3-Axis Digital Compass
      1 x Crowtail - 3-Axis Digital Accelerometer
      1 x Lithium Ion Battery - 1000mAh
      1 x Switch
      1 x Bluetooth Serial Terminal
      1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // EEPROM Library to Read and Write EEPROM
    // with Unique ID for Unit
    #include "EEPROM.h"
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    // Accelemeter ADXL345
    #include <ADXL345.h>
    // Compass HMC5883L
    #include <HMC5883L.h>
    // RTC (Real-Time Clock)
    #include "RTClib.h"
    // GPS Receiver
    #include <TinyGPS++.h>
    // ESP32 Hardware Serial
    #include <HardwareSerial.h>
    // SD Card
    #include "FS.h"
    #include "SD.h"
    #include "SPI.h"
    
    // Define LED Red
    int iLED = 17;
    
    // Switch
    int iSwitch = 16;
    // Variable for reading the Switch status
    int iSwitchState = 0;
    
    // MicroSD Card
    const int chipSelect = 4;
    String zzzzzz = "";
    
    // ESP32 HardwareSerial
    HardwareSerial tGPS(1);
    
    // GPS Receiver
    #define gpsRXPIN 0
    // This one is unused and doesnt have a conection
    #define gpsTXPIN 2
    // The TinyGPS++ object
    TinyGPSPlus gps;
    // Latitude
    float TargetLat;
    // Longitude
    float TargetLon;
    // GPS Date, Time, Speed, Altitude
    // GPS Date
    String TargetDat;
    // GPS Time
    String TargetTim;
    // GPS Speeds M/S
    String TargetSMS;
    // GPS Speeds Km/h
    String TargetSKH;
    // GPS Altitude Meters
    String TargetALTM;
    // GPS Altitude Feet
    String TargetALTF;
    // GPS Status
    String GPSSt = "";
    
    // RTC (Real-Time Clock)
    RTC_DS3231 rtc;
    String dateRTC = "";
    String timeRTC = "";
    String tempRTC = "";
    
    // Compass HMC5883L
    HMC5883L compass;
    // Heading
    float heading;
    // Heading Degrees
    float headingDegrees;
    
    // Variable ADXL345 library
    ADXL345 adxl;
    // Accelerometer ADXL345
    // x, y, z
    int x;
    int y;
    int z;
    // Standard Gravity
    // xyz
    double xyz[3];
    double ax;
    double ay;
    double az;
    
    // FullString
    String FullString = "";
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // EEPROM Unique ID Information
    #define EEPROM_SIZE 64
    String uid = "";
    
    // Software Version Information
    String sver = "25-12";
    
    void loop() {
    
      // Accelemeter ADXL345
      isADXL345();
    
      // Compass HMC5883L
      isHMC5883L();
    
      // RTC (Real-Time Clock)
      isRTC();
    
      // isGPS
      isGPS();
    
      // Accelemeter ADXL345 Compass HMC5883L Display
      isDisplayADXL345HMC5883L();
    
      // Read the state of the Switch value
      iSwitchState = digitalRead(iSwitch);
    
      // The Switch is HIGH:
      if (iSwitchState == HIGH) {
    
        // LED Red HIGH
        digitalWrite(iLED, HIGH);
    
        // MicroSD Card
        isSD();
    
      } else {
    
        // LED Red LOW
        digitalWrite(iLED, LOW);
    
      }
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getAccelemeterADXL345.ino

    // Accelemeter ADXL345
    // Setup Accelemeter ADXL345
    void isSetupADXL345(){
    
      // Power On
      adxl.powerOn();
    
      // Set activity inactivity thresholds (0-255)
      // 62.5mg per increment
      adxl.setActivityThreshold(75);
      // 62.5mg per increment
      adxl.setInactivityThreshold(75);
      // How many seconds of no activity is inactive?
      adxl.setTimeInactivity(10);
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      // Look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      // Set values for what is a tap, and what is a double tap (0-255)
      // 62.5mg per increment
      adxl.setTapThreshold(50);
      // 625us per increment
      adxl.setTapDuration(15);
      // 1.25ms per increment
      adxl.setDoubleTapLatency(80);
      // 1.25ms per increment
      adxl.setDoubleTapWindow(200);
     
      // set values for what is considered freefall (0-255)
      // (5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallThreshold(7);
      // (20 - 70) recommended - 5ms per increment
      adxl.setFreeFallDuration(45);
     
      // Setting all interrupts to take place on int pin 1
      // I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      // Register interrupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    
    }
    // Accelemeter ADXL345
    void isADXL345(){
    
      // Read the accelerometer values and store them in variables  x,y,z
      adxl.readXYZ(&x, &y, &z);
    
      // Standard Gravity
      // Acceleration
      adxl.getAcceleration(xyz);
    
      // Output
      ax = xyz[0];
      ay = xyz[1];
      az = xyz[2];
      
    }
    

    getCompassHMC5883L.ino

    // HMC5883L Triple Axis Digital Compass
    // Setup HMC5883L
    void isSetupHMC5883L(){
    
      // Initialize Initialize HMC5883L
      compass.begin();
    
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);
    
      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);
    
      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_30HZ);
    
      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);
    
      // Set calibration offset
      compass.setOffset(0, 0);
      
    }
    // Compass HMC5883L
    void isHMC5883L(){
    
      // Vector norm
      Vector norm = compass.readNormalize();
    
      // Calculate heading
      heading = atan2(norm.YAxis, norm.XAxis);
    
      // Set declination angle on your location and fix heading
      // You can find your declination on: http://magnetic-declination.com/
      // (+) Positive or (-) for negative
      // Latitude: 32° 39' 7.9" N
      // Longitude: 115° 28' 6.2" W
      // Magnetic Declination: +10° 35'
      // Declination is POSITIVE (EAST)
      // Inclination: 58° 4'
      // Magnetic field strength: 45759.1 nT
      // Formula: (deg + (min / 60.0)) / (180 / M_PI);
      float declinationAngle = (10.0 + (35.0 / 60.0)) / (180 / M_PI);
      heading += declinationAngle;
    
      // Correct for heading < 0deg and heading > 360deg
      if (heading < 0)
      {
        heading += 2 * PI;
      }
    
      if (heading > 2 * PI)
      {
        heading -= 2 * PI;
      }
    
      // Convert to degrees
      headingDegrees = heading * 180/M_PI; 
    
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // SD
      screen.setCursor(0, 60);
      screen.println("SD");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
      // EEPROM
      screen.setCursor(0, 150);
      screen.println("EEPROM");
      screen.setCursor(0, 180);
      screen.println( uid );
    
    }
    // Accelemeter and Compass, ADXL345 and HMC5883L
    void isDisplayADXL345HMC5883L(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => white
      screen.fillScreen(0xffff);
      // Text Color => blue
      screen.setTextColor(0x001F);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Accelemeter ADXL345
      screen.setCursor(0, 30);
      screen.println("Accelemeter ADXL345");
      // Accelemeter ADXL345 X
      screen.setCursor(0, 60);
      screen.println("X: ");
      screen.setCursor(40, 60);
      screen.println( x );
      // Accelemeter ADXL345 Y
      screen.setCursor(0, 90);
      screen.println( "Y: " );
      screen.setCursor(40, 90);
      screen.println( y );
      // Accelemeter ADXL345 Z
      screen.setCursor(0, 120);
      screen.println( "Z: " );
      screen.setCursor(40, 120);
      screen.println( z );
      // Compass HMC5883L
      screen.setCursor(0, 150);
      screen.println( "Compass HMC5883L" );
      // Heading
      screen.setCursor(0, 180);
      screen.println( "Heading = " );
      screen.setCursor(130, 180);
      screen.println( heading );
      // Degress
      screen.setCursor(0, 210);
      screen.println( "Degress = " );
      screen.setCursor(130, 210);
      screen.println( headingDegrees );
      
    }
    

    getEEPROM.ino

    // EEPROM
    // isUID EEPROM Unique ID
    void isUID() {
      
      // Is Unit ID
      uid = "";
      for (int x = 0; x < 7; x++)
      {
        uid = uid + char(EEPROM.read(x));
      }
      
    }
    

    getGPS.ino

    // GPS Receiver
    // Setup GPS
    void isSetupGPS() {
    
      // Setup GPS
      tGPS.begin(  9600 , SERIAL_8N1 , gpsRXPIN , gpsTXPIN );
      
    }
    // isGPS
    void isGPS(){
    
      // Receives NEMA data from GPS receiver
      // This sketch displays information every time a new sentence is correctly encoded
      while ( tGPS.available() > 0)
        
        if (gps.encode( tGPS.read() ))
        {
         
           // GPS Vector Pointer Target
           displayInfo();
           // GPS Date, Time, Speed, Altitude
           displayDTS();
           
        }
      
      if (millis() > 5000 && gps.charsProcessed() < 10)
      {
       
         while(true);
        
      }
    
    }
    // GPS Vector Pointer Target
    void displayInfo(){
    
      // Location
      if (gps.location.isValid())
      {
        
         // Latitude
         TargetLat = gps.location.lat();
         // Longitude
         TargetLon = gps.location.lng();
         // GPS Status 2
         GPSSt = "Yes";
        
      }
      else
      {
    
         // GPS Status 0
         GPSSt = "No";
        
      }
    
    }
    // GPS Date, Time, Speed, Altitude
    void displayDTS(){
    
      // Date
      TargetDat = ""; 
      if (gps.date.isValid())
      {
        
         // Date
         // Year
         TargetDat += String(gps.date.year(), DEC);
         TargetDat += "/";
         // Month
         TargetDat += String(gps.date.month(), DEC);
         TargetDat += "/";
         // Day
         TargetDat += String(gps.date.day(), DEC);
        
      }
    
      // Time
      TargetTim = "";
      if (gps.time.isValid())
      {
        
         // Time
         // Hour
         TargetTim += String(gps.time.hour(), DEC);
         TargetTim += ":";
         // Minute
         TargetTim += String(gps.time.minute(), DEC);
         TargetTim += ":";
         // Secound
         TargetTim += String(gps.time.second(), DEC);
        
      }
    
      // Speed
      TargetSMS = "";
      TargetSKH = "";
      if (gps.speed.isValid())
      {
        
         // Speed
         // M/S
         int x = gps.speed.mps();
         TargetSMS = String( x, DEC);
         // Km/h
         int y = gps.speed.kmph();
         TargetSKH = String( y, DEC);
    
      }
    
      // Altitude
      TargetALTM = "";
      TargetALTF = "";
      if (gps.altitude.isValid())
      {
        
         // Altitude
         // Meters
         int z = gps.altitude.meters();
         TargetALTM = String( z, DEC);
         // Feet
         int zz = gps.altitude.feet();
         TargetALTF = String( zz, DEC);
    
      }
    
    }
    

    getRTC.ino

    // RTC (Real-Time Clock)
    // Setup RTC
    void isSetupRTC(){
    
      // RTC (Real-Time Clock)
      rtc.begin();
      
      // RTC Lost Power
      if (rtc.lostPower()) {
     
        // When time needs to be set on a new device, or after a power loss, the
        // following line sets the RTC to the date & time this sketch was compiled
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
        // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0))
        
      }
      
    }
    // RTC (Real-Time Clock)
    void isRTC(){
    
      // RTC (Real-Time Clock)
      DateTime now = rtc.now();
      
      // Date
      dateRTC = now.year(), DEC; 
      dateRTC = dateRTC + "/";
      dateRTC = dateRTC + now.month(), DEC;
      dateRTC = dateRTC + "/";
      dateRTC = dateRTC + now.day(), DEC;
      
      // Time
      timeRTC = now.hour(), DEC;
      timeRTC = timeRTC + ":";
      timeRTC = timeRTC + now.minute(), DEC;
      timeRTC = timeRTC + ":";
      timeRTC = timeRTC + now.second(), DEC;
    
      // Temperature
      tempRTC = rtc.getTemperature();
    
    }
    

    getSD.ino

    // MicroSD Card
    // MicroSD Setup
    void isSetupSD() {
    
        // MicroSD Card
        pinMode( chipSelect , OUTPUT );
        if(!SD.begin( chipSelect )){
            ;  
            return;
        }
        
        uint8_t cardType = SD.cardType();
    
        // CARD NONE
        if(cardType == CARD_NONE){
            ; 
            return;
        }
    
        // SD Card Type
        if(cardType == CARD_MMC){
            ; 
        } else if(cardType == CARD_SD){
            ; 
        } else if(cardType == CARD_SDHC){
            ; 
        } else {
            ; 
        } 
    
        // Size
        uint64_t cardSize = SD.cardSize() / (1024 * 1024);
     
    }
    // MicroSD Card
    void isSD() {
    
      zzzzzz = "";
    
      //DLE|EEPROM Unique ID|Version|Date|Time|Temperature|
      //Accelerometer X|Accelerometer Y|Accelerometer Z|
      //Accelerometer X|Accelerometer Y|Accelerometer Z|
      //Compass Heading|Compass Degress|
      //GPS|Latitude|Longitude|GPS Date|GPS Time|
      //GPS Speed M/S|GPS Speed Km/h|
      //GPS Altitude Feet|GPS Altitude Meters|*\r
      zzzzzz = "DLE|" + uid + "|" + sver + "|" + String( dateRTC ) + "|" 
      + String( timeRTC ) + "|" + String( tempRTC ) + "|" 
      + String(x) + "|" + String(y) + "|" + String(z) + "|" 
      + String(ax) + "|" + String(ay) + "|" + String(az) + "|"
      + String( heading ) + "|" + String( headingDegrees ) + "|" 
      + String(GPSSt) + "|" + String(TargetLat) + "|" + String(TargetLon) + "|"
      + String(TargetDat) + "|" + String(TargetTim) + "|" 
      + String(TargetSMS) + "|" + String(TargetSKH) + "|"
      + String(TargetALTF) + "|" + String(TargetALTM)+ "|*\r";
    
      // msg + 1
      char msg[zzzzzz.length() + 1];
    
      zzzzzz.toCharArray(msg, zzzzzz.length() + 1);
    
      // Append File
      appendFile(SD, "/dledata.txt", msg );
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // zzzzzz
      FullString = zzzzzz;
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      
    }
    // List Dir
    void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
        
        // List Dir
        dirname;
        
        File root = fs.open(dirname);
        
        if(!root){
            return;
        }
        
        if(!root.isDirectory()){
            return;
        }
    
        File file = root.openNextFile();
        
        while(file){
            if(file.isDirectory()){
                file.name();
                if(levels){
                    listDir(fs, file.name(), levels -1);
                }
            } else {
                file.name();
                file.size();
            }
            file = root.openNextFile();
        }
        
    }
    // Write File
    void writeFile(fs::FS &fs, const char * path, const char * message){
        
        // Write File
        path;
        
        File file = fs.open(path, FILE_WRITE);
        
        if(!file){
            return;
        }
        
        if(file.print(message)){
            ;  
        } else {
            ;  
        }
        
        file.close();
        
    }
    // Append File
    void appendFile(fs::FS &fs, const char * path, const char * message){
        
        // Append File
        path;
        
        File file = fs.open(path, FILE_APPEND);
        
        if(!file){
            return;
        }
        
        if(file.print(message)){
            ;  
        } else {
            ;  
        }
        
        file.close();
        
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("DL2502Mk05");
      Serial.println("Bluetooth Started! Ready to pair...");
    
      // Delay
      delay( 100 );
    
      // EEPROM Size
      EEPROM.begin(EEPROM_SIZE);
      
      // EEPROM Unique ID
      isUID();
      
      // Delay
      delay(100);
    
      // Wire
      Wire.begin();
    
      // Delay
      delay(100);
      
      // Setup RTC
      isSetupRTC();
      
      // Delay
      delay(100);
    
      //MicroSD Card
      isSetupSD();
    
      // Delay
      delay(100);
      
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Setup Accelemeter ADXL345
      isSetupADXL345();
    
      // Setup HMC5883L
      isSetupHMC5883L();
    
      // Delay
      delay( 100 );
    
      // GPS Receiver
      // Setup GPS
      isSetupGPS();
    
      // Delay
      delay( 100 );
    
      // iLED Red
      pinMode(iLED, OUTPUT);
    
      // LED Red LOW
      digitalWrite(iLED, LOW);
    
      // Delay
      delay( 100 );
    
      // Switch
      pinMode(iSwitch,INPUT);
    
      // Delay
      delay( 100 );
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consultant

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2025
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #25 – Movement – GPS Receiver – Mk11

    ——

    #DonLucElectronics #DonLuc #GPS #RTC #EEPROM #Compass #Accelerometer #Movement #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    GPS Receiver

    ——

    GPS Receiver

    ——

    GPS Receiver

    ——

    Global Positioning System (GPS)

    The Global Positioning System (GPS) is a satellite-based radionavigation system owned by the United States government and operated by the United States Space Force. It is one of the global navigation satellite systems (GNSS) that provides geolocation and time information to a GPS receiver anywhere on or near the Earth where there is an unobstructed line of sight to four or more GPS satellites. Obstacles such as mountains and buildings block the relatively weak GPS signals.

    GPS Receiver – GP-20U7

    The GP-20U7 is a compact GPS receiver with a built-in high performances All-In-One GPS chipset. The GP-20U7 accurately provides position, velocity, and time readings as well possessing high sensitivity and tracking capabilities. Thanks to the low power consumption this receiver requires, the GP-20U7 is ideal for portable applications such as tablet PCs, smart phones, and other devices requiring positioning capability.

    DL2502Mk03

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail – I2C Hub 2.0
    1 x GPS Receiver – GP-20U7
    1 x Adafruit DS3231 Precision RTC FeatherWing
    1 x CR1220 Battery
    1 x Crowtail – 3-Axis Digital Compass
    1 x Crowtail – 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    SCL – 22
    SDA – 21
    GPR – 0
    GPT – 2
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    DL2502Mk03p

    DL2502Mk03p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Project #25 - Movement - GPS Receiver - Mk11
    25-11
    DL2502Mk03p.ino
    DL2502Mk03
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0" 320x240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail - I2C Hub 2.0
    1 x GPS Receiver - GP-20U7
    1 x Adafruit DS3231 Precision RTC FeatherWing
    1 x CR1220 Battery
    1 x Crowtail - 3-Axis Digital Compass
    1 x Crowtail - 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // EEPROM Library to Read and Write EEPROM
    // with Unique ID for Unit
    #include "EEPROM.h"
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    // Accelemeter ADXL345
    #include <ADXL345.h>
    // Compass HMC5883L
    #include <HMC5883L.h>
    // RTC (Real-Time Clock)
    #include "RTClib.h"
    // GPS Receiver
    #include <TinyGPS++.h>
    // ESP32 Hardware Serial
    #include <HardwareSerial.h>
    
    // ESP32 HardwareSerial
    HardwareSerial tGPS(1);
    
    // GPS Receiver
    #define gpsRXPIN 0
    // This one is unused and doesnt have a conection
    #define gpsTXPIN 2
    // The TinyGPS++ object
    TinyGPSPlus gps;
    // Latitude
    float TargetLat;
    // Longitude
    float TargetLon;
    // GPS Date, Time, Speed, Altitude
    // GPS Date
    String TargetDat;
    // GPS Time
    String TargetTim;
    // GPS Speeds M/S
    String TargetSMS;
    // GPS Speeds Km/h
    String TargetSKH;
    // GPS Altitude Meters
    String TargetALTM;
    // GPS Altitude Feet
    String TargetALTF;
    // GPS Status
    String GPSSt = "";
    
    // RTC (Real-Time Clock)
    RTC_DS3231 rtc;
    String dateRTC = "";
    String timeRTC = "";
    
    // Compass HMC5883L
    HMC5883L compass;
    // Heading
    float heading;
    // Heading Degrees
    float headingDegrees;
    
    // Variable ADXL345 library
    ADXL345 adxl;
    // Accelerometer ADXL345
    // x, y, z
    int x;
    int y;
    int z;
    // Standard Gravity
    // xyz
    double xyz[3];
    double ax;
    double ay;
    double az;
    
    // FullString
    String FullString = "";
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // EEPROM Unique ID Information
    #define EEPROM_SIZE 64
    String uid = "";
    
    // Software Version Information
    String sver = "25-11";
    
    void loop() {
    
    
      // Accelemeter ADXL345
      isADXL345();
    
      // Compass HMC5883L
      isHMC5883L();
    
      // isEEPROM
      isEEPROM();
    
      // RTC (Real-Time Clock)
      isRTC();
    
      // isGPS
      isGPS();
    
      // Accelemeter ADXL345 Compass HMC5883L Display
      isDisplayADXL345HMC5883L();
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getAccelemeterADXL345.ino

    // Accelemeter ADXL345
    // Setup Accelemeter ADXL345
    void isSetupADXL345(){
    
      // Power On
      adxl.powerOn();
    
      // Set activity inactivity thresholds (0-255)
      // 62.5mg per increment
      adxl.setActivityThreshold(75);
      // 62.5mg per increment
      adxl.setInactivityThreshold(75);
      // How many seconds of no activity is inactive?
      adxl.setTimeInactivity(10);
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      // Look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      // Set values for what is a tap, and what is a double tap (0-255)
      // 62.5mg per increment
      adxl.setTapThreshold(50);
      // 625us per increment
      adxl.setTapDuration(15);
      // 1.25ms per increment
      adxl.setDoubleTapLatency(80);
      // 1.25ms per increment
      adxl.setDoubleTapWindow(200);
     
      // set values for what is considered freefall (0-255)
      // (5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallThreshold(7);
      // (20 - 70) recommended - 5ms per increment
      adxl.setFreeFallDuration(45);
     
      // Setting all interrupts to take place on int pin 1
      // I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      // Register interrupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    
    }
    // Accelemeter ADXL345
    void isADXL345(){
    
      // Read the accelerometer values and store them in variables  x,y,z
      adxl.readXYZ(&x, &y, &z);
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
      
      // FullString
      FullString = "Values of X , Y , Z: " + String(x) + " , " + 
      String(y) + " , " + String(z) + + "\r\n";
    
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Standard Gravity
      // Acceleration
      adxl.getAcceleration(xyz);
    
      // Output
      ax = xyz[0];
      ay = xyz[1];
      az = xyz[2];
      
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
    
      // FullString
      // xg
      FullString = "X = " + String(ax) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // yg
      FullString = "y = " + String(ay) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // zg
      FullString = "z = " + String(az) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    getCompassHMC5883L.ino

    // HMC5883L Triple Axis Digital Compass
    // Setup HMC5883L
    void isSetupHMC5883L(){
    
      // Initialize Initialize HMC5883L
      compass.begin();
    
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);
    
      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);
    
      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_30HZ);
    
      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);
    
      // Set calibration offset
      compass.setOffset(0, 0);
      
    }
    // Compass HMC5883L
    void isHMC5883L(){
    
      // Vector norm
      Vector norm = compass.readNormalize();
    
      // Calculate heading
      heading = atan2(norm.YAxis, norm.XAxis);
    
      // Set declination angle on your location and fix heading
      // You can find your declination on: http://magnetic-declination.com/
      // (+) Positive or (-) for negative
      // Latitude: 32° 39' 7.9" N
      // Longitude: 115° 28' 6.2" W
      // Magnetic Declination: +10° 35'
      // Declination is POSITIVE (EAST)
      // Inclination: 58° 4'
      // Magnetic field strength: 45759.1 nT
      // Formula: (deg + (min / 60.0)) / (180 / M_PI);
      float declinationAngle = (10.0 + (35.0 / 60.0)) / (180 / M_PI);
      heading += declinationAngle;
    
      // Correct for heading < 0deg and heading > 360deg
      if (heading < 0)
      {
        heading += 2 * PI;
      }
    
      if (heading > 2 * PI)
      {
        heading -= 2 * PI;
      }
    
      // Convert to degrees
      headingDegrees = heading * 180/M_PI; 
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Heading
      FullString = "Heading = " + String( heading ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Degress
      FullString = "Degress = " + String( headingDegrees ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // GPS Receiver
      screen.setCursor(0, 60);
      screen.println("GPS Receiver");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
      // EEPROM
      screen.setCursor(0, 150);
      screen.println("EEPROM");
      screen.setCursor(0, 180);
      screen.println( uid );
    
    }
    // Accelemeter and Compass, ADXL345 and HMC5883L
    void isDisplayADXL345HMC5883L(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => white
      screen.fillScreen(0xffff);
      // Text Color => blue
      screen.setTextColor(0x001F);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Accelemeter ADXL345
      screen.setCursor(0, 30);
      screen.println("Accelemeter ADXL345");
      // Accelemeter ADXL345 X
      screen.setCursor(0, 60);
      screen.println("X: ");
      screen.setCursor(40, 60);
      screen.println( x );
      // Accelemeter ADXL345 Y
      screen.setCursor(0, 90);
      screen.println( "Y: " );
      screen.setCursor(40, 90);
      screen.println( y );
      // Accelemeter ADXL345 Z
      screen.setCursor(0, 120);
      screen.println( "Z: " );
      screen.setCursor(40, 120);
      screen.println( z );
      // Compass HMC5883L
      screen.setCursor(0, 150);
      screen.println( "Compass HMC5883L" );
      // Heading
      screen.setCursor(0, 180);
      screen.println( "Heading = " );
      screen.setCursor(130, 180);
      screen.println( heading );
      // Degress
      screen.setCursor(0, 210);
      screen.println( "Degress = " );
      screen.setCursor(130, 210);
      screen.println( headingDegrees );
      
    }
    

    getEEPROM.ino

    // EEPROM
    // isUID EEPROM Unique ID
    void isUID() {
      
      // Is Unit ID
      uid = "";
      for (int x = 0; x < 7; x++)
      {
        uid = uid + char(EEPROM.read(x));
      }
      
    }
    // isEEPROM
    void isEEPROM(){
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // EEPROM
      FullString = "EEPROM = " + String( uid ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getGPS.ino

    // GPS Receiver
    // Setup GPS
    void isSetupGPS() {
    
      // Setup GPS
      tGPS.begin(  9600 , SERIAL_8N1 , gpsRXPIN , gpsTXPIN );
      
    }
    // isGPS
    void isGPS(){
    
      // Receives NEMA data from GPS receiver
      // This sketch displays information every time a new sentence is correctly encoded
      while ( tGPS.available() > 0)
        
        if (gps.encode( tGPS.read() ))
        {
         
           // GPS Vector Pointer Target
           displayInfo();
           // GPS Date, Time, Speed, Altitude
           displayDTS();
           
        }
      
      if (millis() > 5000 && gps.charsProcessed() < 10)
      {
       
         while(true);
        
      }
    
    }
    // GPS Vector Pointer Target
    void displayInfo(){
    
      // Location
      if (gps.location.isValid())
      {
        
         // Latitude
         TargetLat = gps.location.lat();
         // Longitude
         TargetLon = gps.location.lng();
         // GPS Status 2
         GPSSt = "Yes";
        
      }
      else
      {
    
         // GPS Status 0
         GPSSt = "No";
        
      }
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Latitude
      FullString = "Latitude = " + String( TargetLat ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Longitude
      FullString = "Longitude = " + String( TargetLon ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // GPS Status
      FullString = "GPS Status = " + String( GPSSt ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    
    }
    // GPS Date, Time, Speed, Altitude
    void displayDTS(){
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Date
      TargetDat = ""; 
      if (gps.date.isValid())
      {
        
         // Date
         // Year
         TargetDat += String(gps.date.year(), DEC);
         TargetDat += "/";
         // Month
         TargetDat += String(gps.date.month(), DEC);
         TargetDat += "/";
         // Day
         TargetDat += String(gps.date.day(), DEC);
        
      }
    
      // Date
      FullString = "Date = " + String( TargetDat ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Time
      TargetTim = "";
      if (gps.time.isValid())
      {
        
         // Time
         // Hour
         TargetTim += String(gps.time.hour(), DEC);
         TargetTim += ":";
         // Minute
         TargetTim += String(gps.time.minute(), DEC);
         TargetTim += ":";
         // Secound
         TargetTim += String(gps.time.second(), DEC);
        
      }
    
      // FullString
      // Time
      FullString = "Time = " + String( TargetTim ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Speed
      TargetSMS = "";
      TargetSKH = "";
      if (gps.speed.isValid())
      {
        
         // Speed
         // M/S
         int x = gps.speed.mps();
         TargetSMS = String( x, DEC);
         // Km/h
         int y = gps.speed.kmph();
         TargetSKH = String( y, DEC);
    
      }
    
      // FullString
      // GPS Speeds M/S
      FullString = "GPS Speeds M/S = " + String( TargetSMS ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // GPS Speeds Km/h
      FullString = "GPS Speeds Km/h = " + String( TargetSKH ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Altitude
      TargetALTM = "";
      TargetALTF = "";
      if (gps.altitude.isValid())
      {
        
         // Altitude
         // Meters
         int z = gps.altitude.meters();
         TargetALTM = String( z, DEC);
         // Feet
         int zz = gps.altitude.feet();
         TargetALTF = String( zz, DEC);
    
      }
    
      // FullString
      //GPS Altitude Meters
      FullString = "GPS Altitude Meters = " + String( TargetALTM ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // GPS Altitude Feet
      FullString = "GPS Altitude Feet = " + String( TargetALTF ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getRTC.ino

    // RTC (Real-Time Clock)
    // Setup RTC
    void isSetupRTC(){
    
      // RTC (Real-Time Clock)
      rtc.begin();
      
      // RTC Lost Power
      if (rtc.lostPower()) {
     
        // When time needs to be set on a new device, or after a power loss, the
        // following line sets the RTC to the date & time this sketch was compiled
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
        // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0))
        
      }
      
    }
    // RTC (Real-Time Clock)
    void isRTC(){
    
      // RTC (Real-Time Clock)
      DateTime now = rtc.now();
      
      // Date
      dateRTC = now.year(), DEC; 
      dateRTC = dateRTC + "/";
      dateRTC = dateRTC + now.month(), DEC;
      dateRTC = dateRTC + "/";
      dateRTC = dateRTC + now.day(), DEC;
      
      // Time
      timeRTC = now.hour(), DEC;
      timeRTC = timeRTC + ":";
      timeRTC = timeRTC + now.minute(), DEC;
      timeRTC = timeRTC + ":";
      timeRTC = timeRTC + now.second(), DEC;
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Date
      FullString = "Date = " + String( timeRTC ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Time
      FullString = "Time = " + String( dateRTC ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Temperature
      FullString = "Temperature = " + String( rtc.getTemperature() ) 
      + String( " C" ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("DL2502Mk03");
      Serial.println("Bluetooth Started! Ready to pair...");
    
      // Delay
      delay( 100 );
    
      // EEPROM Size
      EEPROM.begin(EEPROM_SIZE);
      
      // EEPROM Unique ID
      isUID();
      
      // Delay
      delay(100);
    
      // Wire
      Wire.begin();
    
      // Delay
      delay(100);
      
      // Setup RTC
      isSetupRTC();
      
      // Delay
      delay(100);
      
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Setup Accelemeter ADXL345
      isSetupADXL345();
    
      // Setup HMC5883L
      isSetupHMC5883L();
    
      // Delay
      delay( 100 );
    
      // GPS Receiver
      // Setup GPS
      isSetupGPS();
    
      // Delay
      delay( 100 );
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consultant

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2025
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #25 – Movement – RTC – Mk10

    ——

    #DonLucElectronics #DonLuc #RTC #EEPROM #Compass #Accelerometer #Movement #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    RTC

    ——

    RTC

    ——

    RTC

    ——

    Adafruit DS3231 Precision RTC FeatherWing

    This is the DS3231 Precision RTC FeatherWing: it adds an extremely accurate I2C-integrated Real Time Clock (RTC) with a Temperature Compensated Crystal Oscillator to any Feather main board. This RTC is the most precise you can get in a small, low power package. Most RTCs use an external 32kHz timing crystal that is used to keep time with low current draw. And that’s all well and good, but those crystals have slight drift, particularly when the temperature changes (the temperature changes the oscillation frequency very very very slightly but it does add up!) This RTC is in a beefy package because the crystal is inside the chip! And right next to the integrated crystal is a temperature sensor. That sensor compensates for the frequency changes by adding or removing clock ticks so that the timekeeping stays on schedule. With a CR1220 12mm coin cell plugged into the top of the FeatherWing, you can get years of precision timekeeping, even when main power is lost. Great for datalogging and clocks, or anything where you need to really know the time.

    DL2502Mk01

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail – I2C Hub 2.0
    1 x Adafruit DS3231 Precision RTC FeatherWing
    1 x CR1220 Battery
    1 x Crowtail – 3-Axis Digital Compass
    1 x Crowtail – 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    SCL – 22
    SDA – 21
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    ——

    DL2502Mk01p

    DL2502Mk01p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Project #25 - Movement - RTC - Mk10
    25-10
    DL2502Mk01p.ino
    DL2502Mk01
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0" 320x240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail - I2C Hub 2.0
    1 x Adafruit DS3231 Precision RTC FeatherWing
    1 x CR1220 Battery
    1 x Crowtail - 3-Axis Digital Compass
    1 x Crowtail - 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // EEPROM Library to Read and Write EEPROM
    // with Unique ID for Unit
    #include "EEPROM.h"
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    // Accelemeter ADXL345
    #include <ADXL345.h>
    // Compass HMC5883L
    #include <HMC5883L.h>
    // RTC (Real-Time Clock)
    #include "RTClib.h"
    
    // RTC (Real-Time Clock)
    RTC_DS3231 rtc;
    String dateRTC = "";
    String timeRTC = "";
    
    // Compass HMC5883L
    HMC5883L compass;
    // Heading
    float heading;
    // Heading Degrees
    float headingDegrees;
    
    // Variable ADXL345 library
    ADXL345 adxl;
    // Accelerometer ADXL345
    // x, y, z
    int x;
    int y;
    int z;
    // Standard Gravity
    // xyz
    double xyz[3];
    double ax;
    double ay;
    double az;
    
    // FullString
    String FullString = "";
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // EEPROM Unique ID Information
    #define EEPROM_SIZE 64
    String uid = "";
    
    // Software Version Information
    String sver = "25-10";
    
    void loop() {
    
      // Accelemeter ADXL345
      isADXL345();
    
      // Compass HMC5883L
      isHMC5883L();
    
      // isEEPROM
      isEEPROM();
    
      // RTC (Real-Time Clock)
      isRTC();
    
      // Accelemeter and Compass, ADXL345 and HMC5883L
      isDisplayADXL345HMC5883L();
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getAccelemeterADXL345.ino

    // Accelemeter ADXL345
    // Setup Accelemeter ADXL345
    void isSetupADXL345(){
    
      // Power On
      adxl.powerOn();
    
      // Set activity inactivity thresholds (0-255)
      // 62.5mg per increment
      adxl.setActivityThreshold(75);
      // 62.5mg per increment
      adxl.setInactivityThreshold(75);
      // How many seconds of no activity is inactive?
      adxl.setTimeInactivity(10);
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      // Look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      // Set values for what is a tap, and what is a double tap (0-255)
      // 62.5mg per increment
      adxl.setTapThreshold(50);
      // 625us per increment
      adxl.setTapDuration(15);
      // 1.25ms per increment
      adxl.setDoubleTapLatency(80);
      // 1.25ms per increment
      adxl.setDoubleTapWindow(200);
     
      // set values for what is considered freefall (0-255)
      // (5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallThreshold(7);
      // (20 - 70) recommended - 5ms per increment
      adxl.setFreeFallDuration(45);
     
      // Setting all interrupts to take place on int pin 1
      // I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      // Register interrupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    
    }
    // Accelemeter ADXL345
    void isADXL345(){
    
      // Read the accelerometer values and store them in variables  x,y,z
      adxl.readXYZ(&x, &y, &z);
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
      
      // FullString
      FullString = "Values of X , Y , Z: " + String(x) + " , " + 
      String(y) + " , " + String(z) + + "\r\n";
    
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Standard Gravity
      // Acceleration
      adxl.getAcceleration(xyz);
    
      // Output
      ax = xyz[0];
      ay = xyz[1];
      az = xyz[2];
      
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
    
      // FullString
      // xg
      FullString = "X = " + String(ax) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // yg
      FullString = "y = " + String(ay) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // zg
      FullString = "z = " + String(az) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    getCompassHMC5883L.ino

    // HMC5883L Triple Axis Digital Compass
    // Setup HMC5883L
    void isSetupHMC5883L(){
    
      // Initialize Initialize HMC5883L
      compass.begin();
    
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);
    
      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);
    
      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_30HZ);
    
      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);
    
      // Set calibration offset
      compass.setOffset(0, 0);
      
    }
    // Compass HMC5883L
    void isHMC5883L(){
    
      // Vector norm
      Vector norm = compass.readNormalize();
    
      // Calculate heading
      heading = atan2(norm.YAxis, norm.XAxis);
    
      // Set declination angle on your location and fix heading
      // You can find your declination on: http://magnetic-declination.com/
      // (+) Positive or (-) for negative
      // Latitude: 32° 39' 7.9" N
      // Longitude: 115° 28' 6.2" W
      // Magnetic Declination: +10° 35'
      // Declination is POSITIVE (EAST)
      // Inclination: 58° 4'
      // Magnetic field strength: 45759.1 nT
      // Formula: (deg + (min / 60.0)) / (180 / M_PI);
      float declinationAngle = (10.0 + (35.0 / 60.0)) / (180 / M_PI);
      heading += declinationAngle;
    
      // Correct for heading < 0deg and heading > 360deg
      if (heading < 0)
      {
        heading += 2 * PI;
      }
    
      if (heading > 2 * PI)
      {
        heading -= 2 * PI;
      }
    
      // Convert to degrees
      headingDegrees = heading * 180/M_PI; 
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Heading
      FullString = "Heading = " + String( heading ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Degress
      FullString = "Degress = " + String( headingDegrees ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // Real-Time Clock
      screen.setCursor(0, 60);
      screen.println("Real-Time Clock");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
      // EEPROM
      screen.setCursor(0, 150);
      screen.println("EEPROM");
      screen.setCursor(0, 180);
      screen.println( uid );
    
    }
    // Accelemeter and Compass, ADXL345 and HMC5883L
    void isDisplayADXL345HMC5883L(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => white
      screen.fillScreen(0xffff);
      // Text Color => blue
      screen.setTextColor(0x001F);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Accelemeter ADXL345
      screen.setCursor(0, 30);
      screen.println("Accelemeter ADXL345");
      // Accelemeter ADXL345 X
      screen.setCursor(0, 60);
      screen.println("X: ");
      screen.setCursor(40, 60);
      screen.println( x );
      // Accelemeter ADXL345 Y
      screen.setCursor(0, 90);
      screen.println( "Y: " );
      screen.setCursor(40, 90);
      screen.println( y );
      // Accelemeter ADXL345 Z
      screen.setCursor(0, 120);
      screen.println( "Z: " );
      screen.setCursor(40, 120);
      screen.println( z );
      // Compass HMC5883L
      screen.setCursor(0, 150);
      screen.println( "Compass HMC5883L" );
      // Heading
      screen.setCursor(0, 180);
      screen.println( "Heading = " );
      screen.setCursor(130, 180);
      screen.println( heading );
      // Degress
      screen.setCursor(0, 210);
      screen.println( "Degress = " );
      screen.setCursor(130, 210);
      screen.println( headingDegrees );
      
    }
    

    getEEPROM.ino

    // EEPROM
    // isUID EEPROM Unique ID
    void isUID() {
      
      // Is Unit ID
      uid = "";
      for (int x = 0; x < 7; x++)
      {
        uid = uid + char(EEPROM.read(x));
      }
      
    }
    // isEEPROM
    void isEEPROM(){
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // EEPROM
      FullString = "EEPROM = " + String( uid ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getRTC.ino

    // RTC (Real-Time Clock)
    // Setup RTC
    void isSetupRTC(){
    
      // RTC (Real-Time Clock)
      rtc.begin();
      
      // RTC Lost Power
      if (rtc.lostPower()) {
     
        // When time needs to be set on a new device, or after a power loss, the
        // following line sets the RTC to the date & time this sketch was compiled
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
        // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0))
        
      }
      
    }
    // RTC (Real-Time Clock)
    void isRTC(){
    
      // RTC (Real-Time Clock)
      DateTime now = rtc.now();
      
      // Date
      dateRTC = now.year(), DEC; 
      dateRTC = dateRTC + "/";
      dateRTC = dateRTC + now.month(), DEC;
      dateRTC = dateRTC + "/";
      dateRTC = dateRTC + now.day(), DEC;
      
      // Time
      timeRTC = now.hour(), DEC;
      timeRTC = timeRTC + ":";
      timeRTC = timeRTC + now.minute(), DEC;
      timeRTC = timeRTC + ":";
      timeRTC = timeRTC + now.second(), DEC;
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Date
      FullString = "Date = " + String( timeRTC ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Time
      FullString = "Time = " + String( dateRTC ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Temperature
      FullString = "Temperature = " + String( rtc.getTemperature() ) 
      + String( " C" ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("DL2502Mk01");
      Serial.println("Bluetooth Started! Ready to pair...");
    
      // Delay
      delay( 100 );
    
      // EEPROM Size
      EEPROM.begin(EEPROM_SIZE);
      
      // EEPROM Unique ID
      isUID();
      
      // Delay
      delay(100);
    
      // Wire
      Wire.begin();
    
      // Delay
      delay(100);
      
      // Setup RTC
      isSetupRTC();
      
      // Delay
      delay(100);
      
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Setup Accelemeter ADXL345
      isSetupADXL345();
    
      // Setup HMC5883L
      isSetupHMC5883L();
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consultant

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2025
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #25 – Movement – EEPROM – Mk09

    ——

    #DonLucElectronics #DonLuc #EEPROM #HMC5883L #Compass #ADXL345 #Accelerometer #Movement #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    EEPROM

    ——

    EEPROM

    ——

    EEPROM

    ——

    EEPROM

    EEPROM (Electrically Erasable Programmable Read-only Memory) is a type of non-volatile memory. EEPROM is a type of non-volatile ROM that enables individual bytes of data to be erased and reprogrammed. That is why EEPROM chips are known as byte erasable chips. EEPROM is usually used to store small amounts of data in computing and other electronic devices. It is used in computers, usually integrated in microcontrollers such as smart cards and remote keyless systems, or as a separate chip device, to store relatively small amounts of data by allowing individual bytes to be erased and reprogrammed.

    The microcontroller on the Arduino boards have 512 bytes of EEPROM: memory whose values are kept when the board is turned off. Functions in the EEPROM class are automatically included with the platform for your board, meaning you do not need to install any external libraries. The supported microcontrollers on the various Arduino have different amounts of EEPROM: 1024 bytes on the ATmega328P, 512 bytes on the ATmega168 and ATmega8, 4 KB (4096 bytes) on the ATmega1280 and ATmega2560. The Arduino boards have an emulated EEPROM space of 1024 bytes. The EEPROM library on ESP32 provides a reliable way to store data persistently, so that it remains accessible even when the power supply is disconnected. Unlike RAM, the data we save with the EEPROM library does not get lost when power is cut. This feature makes it an ideal choice for retaining configurations, settings, and other important data in embedded devices like the ESP32.

    DL2501Mk07

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail – I2C Hub 2.0
    1 x Crowtail – 3-Axis Digital Compass
    1 x Crowtail – 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    SCL – 22
    SDA – 21
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    DLE-EEPROM-UID-ESP32Mk001

    DLE-EEPROM-UID-ESP32Mk001.ino

    /* ***** Don Luc Electronics © ******
    Software Version Information
    DLE-EEPROM-UID-ESP32Mk001
    ver: ESPMk001
    EEPROM with unique ID
    */
    
    // Include Library Code
    // EEPROM library to read and write EEPROM with unique ID for unit
    #include "EEPROM.h"
    
    // The current address in the EEPROM (i.e. which byte
    // we're going to write to next)
    #define EEPROM_SIZE 64
    
    // Software Version Information
    String sver = "ESPMk001";
    // Unit ID information
    String uid = "DLE0001"; 
    // Read Unique ID
    // String ruid = "";
    
    void loop() 
    {
    
       // <== Write and Read EEPROM 
       isEEPROMw();
      
    }
    

    getEEPROM.ino

    // getEEPROM
    // Write and Read EEPROM with Unique ID for Unit
    void isEEPROMw() {
      
      // EEPROM
      int incb = 0;
      int v = 0;
      String msg = "";
      String emp = "";
      String ruid = "";
      
      // Set Unit ID
      // The message starts with sid then is followed by 5 characters 
      // First clear a string buffer
      emp = "";
      // Loop through the 7 ID characters and write their ASCII (byte) value to the EEPROM
      for (int x = 0; x < 7; x++)
        {
           // Get ASCII value of character
           v = int(uid.charAt(x)); // + 5));
           // Add the actual character to the buffer so we can send it back to the PC
           emp = emp + uid.charAt(x + 5);
           // Write the value to the EEPROM
           EEPROM.write(x, v);
           EEPROM.commit();
        }
    
       delay( 500 );
    
       // Write EEPROM with Unique ID for Unit
       Serial.println( "Write ID Information");
    
      // Read ID Information
      // Unit ID
      for (int y = 0; y < 7; y++)
      {
        
        ruid = ruid + char(EEPROM.read(y));
        
      }
      
      // Read ID Information
      Serial.print( "Read ID Information: ");
      Serial.println( ruid );
      Serial.println( "Ok!" );
      ruid = "";
    
      delay( 5000 );
       
    }
    

    setup.ino

    // Setup
    void setup() 
    {
    
      // EEPROM with unique ID
      EEPROM.begin(EEPROM_SIZE);
    
      // Open the serial port at 9600 bps:
      Serial.begin(9600);
    
      // Serial
      Serial.print( "Software Version Information: ");
      Serial.println( sver );
      Serial.print( "Unit ID Information: ");
      Serial.println( uid );
      
      delay(5000);
       
    }
    

    ——

    DL2501Mk07p

    DL2501Mk07p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Project #25 - Movement - EEPROM - Mk09
    25-09
    DL2501Mk07p.ino
    DL2501Mk07
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0" 320x240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail - I2C Hub 2.0
    1 x Crowtail - 3-Axis Digital Compass
    1 x Crowtail - 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // EEPROM Library to Read and Write EEPROM
    // with Unique ID for Unit
    #include "EEPROM.h"
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    // Accelemeter ADXL345
    #include <ADXL345.h>
    // Compass HMC5883L
    #include <HMC5883L.h>
    
    // Compass HMC5883L
    HMC5883L compass;
    // Heading
    float heading;
    // Heading Degrees
    float headingDegrees;
    
    // Variable ADXL345 library
    ADXL345 adxl;
    // Accelerometer ADXL345
    // x, y, z
    int x;
    int y;
    int z;
    // Standard Gravity
    // xyz
    double xyz[3];
    double ax;
    double ay;
    double az;
    
    // FullString
    String FullString = "";
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // EEPROM Unique ID Information
    #define EEPROM_SIZE 64
    String uid = "";
    
    // Software Version Information
    String sver = "25-09";
    
    void loop() {
    
      // Accelemeter ADXL345
      isADXL345();
    
      // Compass HMC5883L
      isHMC5883L();
    
      // isEEPROM
      isEEPROM();
    
      // Accelemeter ADXL345 Compass HMC5883L Display
      isDisplayADXL345HMC5883L();
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getAccelemeterADXL345.ino

    // Accelemeter ADXL345
    // Setup Accelemeter ADXL345
    void isSetupADXL345(){
    
      // Power On
      adxl.powerOn();
    
      // Set activity inactivity thresholds (0-255)
      // 62.5mg per increment
      adxl.setActivityThreshold(75);
      // 62.5mg per increment
      adxl.setInactivityThreshold(75);
      // How many seconds of no activity is inactive?
      adxl.setTimeInactivity(10);
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      // Look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      // Set values for what is a tap, and what is a double tap (0-255)
      // 62.5mg per increment
      adxl.setTapThreshold(50);
      // 625us per increment
      adxl.setTapDuration(15);
      // 1.25ms per increment
      adxl.setDoubleTapLatency(80);
      // 1.25ms per increment
      adxl.setDoubleTapWindow(200);
     
      // set values for what is considered freefall (0-255)
      // (5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallThreshold(7);
      // (20 - 70) recommended - 5ms per increment
      adxl.setFreeFallDuration(45);
     
      // Setting all interrupts to take place on int pin 1
      // I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      // Register interrupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    
    }
    // Accelemeter ADXL345
    void isADXL345(){
    
      // Read the accelerometer values and store them in variables  x,y,z
      adxl.readXYZ(&x, &y, &z);
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
      
      // FullString
      FullString = "Values of X , Y , Z: " + String(x) + " , " + 
      String(y) + " , " + String(z) + + "\r\n";
    
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Standard Gravity
      // Acceleration
      adxl.getAcceleration(xyz);
    
      // Output
      ax = xyz[0];
      ay = xyz[1];
      az = xyz[2];
      
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
    
      // FullString
      // xg
      FullString = "X = " + String(ax) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // yg
      FullString = "y = " + String(ay) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // zg
      FullString = "z = " + String(az) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    getCompassHMC5883L.ino

    // HMC5883L Triple Axis Digital Compass
    // Setup HMC5883L
    void isSetupHMC5883L(){
    
      // Initialize Initialize HMC5883L
      compass.begin();
    
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);
    
      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);
    
      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_30HZ);
    
      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);
    
      // Set calibration offset
      compass.setOffset(0, 0);
      
    }
    // Compass HMC5883L
    void isHMC5883L(){
    
      // Vector norm
      Vector norm = compass.readNormalize();
    
      // Calculate heading
      heading = atan2(norm.YAxis, norm.XAxis);
    
      // Set declination angle on your location and fix heading
      // You can find your declination on: http://magnetic-declination.com/
      // (+) Positive or (-) for negative
      // Latitude: 32° 39' 7.9" N
      // Longitude: 115° 28' 6.2" W
      // Magnetic Declination: +10° 35'
      // Declination is POSITIVE (EAST)
      // Inclination: 58° 4'
      // Magnetic field strength: 45759.1 nT
      // Formula: (deg + (min / 60.0)) / (180 / M_PI);
      float declinationAngle = (10.0 + (35.0 / 60.0)) / (180 / M_PI);
      heading += declinationAngle;
    
      // Correct for heading < 0deg and heading > 360deg
      if (heading < 0)
      {
        heading += 2 * PI;
      }
    
      if (heading > 2 * PI)
      {
        heading -= 2 * PI;
      }
    
      // Convert to degrees
      headingDegrees = heading * 180/M_PI; 
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Heading
      FullString = "Heading = " + String( heading ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Degress
      FullString = "Degress = " + String( headingDegrees ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // EEPROM
      screen.setCursor(0, 60);
      screen.println("EEPROM");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
      // EEPROM
      screen.setCursor(0, 150);
      screen.println("EEPROM");
      screen.setCursor(0, 180);
      screen.println( uid );
    
    }
    // Accelemeter ADXL345
    void isDisplayADXL345HMC5883L(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => white
      screen.fillScreen(0xffff);
      // Text Color => blue
      screen.setTextColor(0x001F);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Accelemeter ADXL345
      screen.setCursor(0, 30);
      screen.println("Accelemeter ADXL345");
      // Accelemeter ADXL345 X
      screen.setCursor(0, 60);
      screen.println("X: ");
      screen.setCursor(40, 60);
      screen.println( x );
      // Accelemeter ADXL345 Y
      screen.setCursor(0, 90);
      screen.println( "Y: " );
      screen.setCursor(40, 90);
      screen.println( y );
      // Accelemeter ADXL345 Z
      screen.setCursor(0, 120);
      screen.println( "Z: " );
      screen.setCursor(40, 120);
      screen.println( z );
      // Compass HMC5883L
      screen.setCursor(0, 150);
      screen.println( "Compass HMC5883L" );
      // Heading
      screen.setCursor(0, 180);
      screen.println( "Heading = " );
      screen.setCursor(130, 180);
      screen.println( heading );
      // Degress
      screen.setCursor(0, 210);
      screen.println( "Degress = " );
      screen.setCursor(130, 210);
      screen.println( headingDegrees );
      
    }
    

    getEEPROM.ino

    // EEPROM
    // isUID EEPROM Unique ID
    void isUID() {
      
      // Is Unit ID
      uid = "";
      for (int x = 0; x < 7; x++)
      {
        uid = uid + char(EEPROM.read(x));
      }
      
    }
    // isEEPROM
    void isEEPROM(){
    
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // EEPROM
      FullString = "EEPROM = " + String( uid ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("DL2501Mk07");
      Serial.println("Bluetooth Started! Ready to pair...");
    
      // Delay
      delay( 100 );
    
      // EEPROM Size
      EEPROM.begin(EEPROM_SIZE);
      
      // EEPROM Unique ID
      isUID();
      
      // Delay
      delay(100);
    
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Setup Accelemeter ADXL345
      isSetupADXL345();
    
      // Setup HMC5883L
      isSetupHMC5883L();
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consultant

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2025
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #25 – Movement – HMC5883L – Mk08

    ——

    #DonLucElectronics #DonLuc #HMC5883L #ADXL345 #Accelerometer #Movement #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    HMC5883L

    ——

    HMC5883L

    ——

    HMC5883L

    ——

    Crowtail – 3-Axis Digital Compass

    Crowtail-3-Axis Compass module, a member of Crowtail family uses I²C based Honeywell HMC5883L digital compass. This ASIC is equipped with high resolution HMC118X magneto-resistive sensors and a 12-bit ADC. It provides compass heading accuracy up to 1° to 2°. Signal conditioning like amplification, automatic degaussing strap drivers and offset cancellation are inbuilt. This Crowtail module also includes a XC6206P332MR for power supply requirement. Hence user can connect any 3.3V to 6V DC power supply.

    • -Crowtail compatible interface
    • -3-Axis Magneto-resistive type sensors
    • -I²C serial interface
    • -1° to 2° Degree heading accuracy
    • -Up to 116 Hz Maximum output rate
    • -Built-In self test
    • -Low cost compassing
    • -Magnetometry
    • -Pedestrian navigation
    • -Hobby auto navigation
    • -Compassing support for mobile devices and portable computers

    DL2501Mk05

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail – I2C Hub 2.0
    1 x Crowtail – 3-Axis Digital Compass
    1 x Crowtail – 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    SCL – 22
    SDA – 21
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    DL2501Mk05p

    DL2501Mk05p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Project #25 - Movement - HMC5883L - Mk08
    25-08
    DL2501Mk05p.ino
    DL2501Mk05
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0" 320x240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail - I2C Hub 2.0
    1 x Crowtail - 3-Axis Digital Compass
    1 x Crowtail - 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    // Accelemeter ADXL345
    #include <ADXL345.h>
    // Compass HMC5883L
    #include <HMC5883L.h>
    
    // Compass HMC5883L
    HMC5883L compass;
    // Heading
    float heading;
    // Heading Degrees
    float headingDegrees;
    
    // Variable ADXL345 library
    ADXL345 adxl;
    // Accelerometer ADXL345
    // x, y, z
    int x;
    int y;
    int z;
    // Standard Gravity
    // xyz
    double xyz[3];
    double ax;
    double ay;
    double az;
    
    // FullString
    String FullString = "";
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // Software Version Information
    String sver = "25-08";
    
    void loop() {
    
      // Accelemeter ADXL345
      isADXL345();
    
      // Compass HMC5883L
      isHMC5883L();
    
      // Accelemeter ADXL345 Compass HMC5883L Display
      isDisplayADXL345HMC5883L();
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getAccelemeterADXL345.ino

    // Accelemeter ADXL345
    // Setup Accelemeter ADXL345
    void isSetupADXL345(){
    
      // Power On
      adxl.powerOn();
    
      // Set activity inactivity thresholds (0-255)
      // 62.5mg per increment
      adxl.setActivityThreshold(75);
      // 62.5mg per increment
      adxl.setInactivityThreshold(75);
      // How many seconds of no activity is inactive?
      adxl.setTimeInactivity(10);
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      // Look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      // Set values for what is a tap, and what is a double tap (0-255)
      // 62.5mg per increment
      adxl.setTapThreshold(50);
      // 625us per increment
      adxl.setTapDuration(15);
      // 1.25ms per increment
      adxl.setDoubleTapLatency(80);
      // 1.25ms per increment
      adxl.setDoubleTapWindow(200);
     
      // set values for what is considered freefall (0-255)
      // (5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallThreshold(7);
      // (20 - 70) recommended - 5ms per increment
      adxl.setFreeFallDuration(45);
     
      // Setting all interrupts to take place on int pin 1
      // I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      // Register interrupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    
    }
    // Accelemeter ADXL345
    void isADXL345(){
    
      // Read the accelerometer values and store them in variables  x,y,z
      adxl.readXYZ(&x, &y, &z);
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
      
      // FullString
      FullString = "Values of X , Y , Z: " + String(x) + " , " + 
      String(y) + " , " + String(z) + + "\r\n";
    
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
      // Standard Gravity
      // Acceleration
      adxl.getAcceleration(xyz);
    
      // Output
      ax = xyz[0];
      ay = xyz[1];
      az = xyz[2];
      
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
           
      }
    
      // FullString
      // xg
      FullString = "X = " + String(ax) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // yg
      FullString = "y = " + String(ay) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // zg
      FullString = "z = " + String(az) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    getCompassHMC5883L.ino

    // HMC5883L Triple Axis Digital Compass
    // Setup HMC5883L
    void isSetupHMC5883L(){
    
      // Initialize Initialize HMC5883L
      compass.begin();
    
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);
    
      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);
    
      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_30HZ);
    
      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);
    
      // Set calibration offset
      compass.setOffset(0, 0);
      
    }
    // Compass HMC5883L
    void isHMC5883L(){
    
      // Vector norm
      Vector norm = compass.readNormalize();
    
      // Calculate heading
      heading = atan2(norm.YAxis, norm.XAxis);
    
      // Set declination angle on your location and fix heading
      // You can find your declination on: http://magnetic-declination.com/
      // (+) Positive or (-) for negative
      // Latitude: 32° 39' 7.9" N
      // Longitude: 115° 28' 6.2" W
      // Magnetic Declination: +10° 35'
      // Declination is POSITIVE (EAST)
      // Inclination: 58° 4'
      // Magnetic field strength: 45759.1 nT
      // Formula: (deg + (min / 60.0)) / (180 / M_PI);
      float declinationAngle = (10.0 + (35.0 / 60.0)) / (180 / M_PI);
      heading += declinationAngle;
    
      // Correct for heading < 0deg and heading > 360deg
      if (heading < 0)
      {
        heading += 2 * PI;
      }
    
      if (heading > 2 * PI)
      {
        heading -= 2 * PI;
      }
    
      // Convert to degrees
      headingDegrees = heading * 180/M_PI; 
    
      // Output
      // FullString
      // ************
      FullString = "************\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
        
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Heading
      FullString = "Heading = " + String( heading ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
      // FullString
      // Degress
      FullString = "Degress = " + String( headingDegrees ) + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // Accelemeter ADXL345
      screen.setCursor(0, 60);
      screen.println("Compass HMC5883L");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
    
    }
    // Accelemeter ADXL345
    void isDisplayADXL345HMC5883L(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => white
      screen.fillScreen(0xffff);
      // Text Color => blue
      screen.setTextColor(0x001F);
      // Font => Free Sans Bold 12pt
      screen.setFont(&FreeSansBold12pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Accelemeter ADXL345
      screen.setCursor(0, 30);
      screen.println("Accelemeter ADXL345");
      // Accelemeter ADXL345 X
      screen.setCursor(0, 60);
      screen.println("X: ");
      screen.setCursor(40, 60);
      screen.println( x );
      // Accelemeter ADXL345 Y
      screen.setCursor(0, 90);
      screen.println( "Y: " );
      screen.setCursor(40, 90);
      screen.println( y );
      // Accelemeter ADXL345 Z
      screen.setCursor(0, 120);
      screen.println( "Z: " );
      screen.setCursor(40, 120);
      screen.println( z );
      // Compass HMC5883L
      screen.setCursor(0, 150);
      screen.println( "Compass HMC5883L" );
      // Heading
      screen.setCursor(0, 180);
      screen.println( "Heading = " );
      screen.setCursor(130, 180);
      screen.println( heading );
      // Degress
      screen.setCursor(0, 210);
      screen.println( "Degress = " );
      screen.setCursor(130, 210);
      screen.println( headingDegrees );
      
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("DL2501Mk05");
      Serial.println("Bluetooth Started! Ready to pair...");
      
      // Delay
      delay(100);
    
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Setup Accelemeter ADXL345
      isSetupADXL345();
    
      // Setup HMC5883L
      isSetupHMC5883L();
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consultant

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2025
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #25 – Movement – ADXL345 – Mk07

    ——

    #DonLucElectronics #DonLuc #ADXL345 #Accelerometer #Movement #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    ADXL345

    ——

    ADXL345

    ——

    ADXL345

    ——

    Crowtail – 3-Axis Digital Accelerometer

    Crowtail – 3-Axis Digital Accelerometer with specific Crowtail interface, It’s base on an advanced 3-axis IC ADXL345. This is a high resolution digital accelerometer providing you at max 3.9mg/LSB resolution and large ±16g measurement range. Have no worry to implement it into your free-fall detection project, cause it’s robust enough to survive up to 10,000g shock. Meanwhile, it’s agile enough to detect single and double taps. It’s ideal for motion detection, gesture detection as well as robotics. This digital 3-axis accelerometer has excellent EMI protection.
    Its variable output makes it suitable for a wide range of applications:

    • 1. HDD shock protection
    • 2. Vibration sensor
    • 3. Game controller input
    • 4. Robotics
    • 5. Smart vehicles
    • 6. Anywhere you need to obtain motion-sensing and orientation information.
    • 7. The excellent sensitivity provide high-precision output up to ±16g.

    DL2501Mk03

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail – I2C Hub 2.0
    1 x Crowtail – 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    SCL – 22
    SDA – 21
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    DL2501Mk03p

    DL2501Mk03p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Project #25 - Movement - ADXL345 - Mk07
    25-07
    DL2501Mk03p.ino
    DL2501Mk03
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0" 320x240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail - I2C Hub 2.0
    1 x Crowtail - 3-Axis Digital Accelerometer
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    // Accelemeter ADXL345
    #include <ADXL345.h>
    
    // Variable ADXL345 library
    ADXL345 adxl;
    // Accelerometer ADXL345
    // x, y, z
    int x;
    int y;
    int z;
    // Standard Gravity
    // xyz
    double xyz[3];
    double ax;
    double ay;
    double az;
    // FullString
    String FullString = "";
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // Software Version Information
    String sver = "25-07";
    
    void loop() {
    
      // Accelemeter ADXL345
      isADXL345();
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getAccelemeterADXL345.ino

    // Accelemeter ADXL345
    // Setup Accelemeter ADXL345
    void isSetupADXL345(){
    
      // Power On
      adxl.powerOn();
    
      // Set activity inactivity thresholds (0-255)
      // 62.5mg per increment
      adxl.setActivityThreshold(75);
      // 62.5mg per increment
      adxl.setInactivityThreshold(75);
      // How many seconds of no activity is inactive?
      adxl.setTimeInactivity(10);
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      // Look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      // Set values for what is a tap, and what is a double tap (0-255)
      // 62.5mg per increment
      adxl.setTapThreshold(50);
      // 625us per increment
      adxl.setTapDuration(15);
      // 1.25ms per increment
      adxl.setDoubleTapLatency(80);
      // 1.25ms per increment
      adxl.setDoubleTapWindow(200);
     
      // set values for what is considered freefall (0-255)
      // (5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallThreshold(7);
      // (20 - 70) recommended - 5ms per increment
      adxl.setFreeFallDuration(45);
     
      // Setting all interrupts to take place on int pin 1
      // I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      // Register interrupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    
    }
    // Accelemeter ADXL345
    void isADXL345(){
    
      // Read the accelerometer values and store them in variables  x,y,z
      adxl.readXYZ(&x, &y, &z);
      // Output x,y,z values 
      Serial.print("Values of X , Y , Z: ");
      Serial.print(x);
      Serial.print(" , ");
      Serial.print(y);
      Serial.print(" , ");
      Serial.println(z);
    
      // FullString
      FullString = "Values of X , Y , Z: " + String(x) + " , " + 
      String(y) + " , " + String(z) + + "\r\n";
    
      // Accelemeter ADXL345
      isDisplayADXL345();
    
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // Standard Gravity
      // Acceleration
      adxl.getAcceleration(xyz);
      ax = xyz[0];
      ay = xyz[1];
      az = xyz[2];
      Serial.print("X=");
      Serial.print(ax);
        Serial.println(" g");
      Serial.print("Y=");
      Serial.print(ay);
        Serial.println(" g");
      Serial.print("Z=");
      Serial.println(az);
        Serial.println(" g");
      Serial.println("**********************");
    
      // FullString
      // xg
      FullString = "X = " + String(ax) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // yg
      FullString = "y = " + String(ay) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
      // zg
      FullString = "z = " + String(az) + " g" + "\r\n";
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Mono 9pt
      screen.setFont(&FreeMono9pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // Accelemeter ADXL345
      screen.setCursor(0, 60);
      screen.println("Accelemeter ADXL345");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
    
    }
    // Accelemeter ADXL345
    void isDisplayADXL345(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Mono 9pt
      screen.setFont(&FreeMono9pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Accelemeter ADXL345
      screen.setCursor(0, 30);
      screen.println("Accelemeter ADXL345");
      // Accelemeter ADXL345 X
      screen.setCursor(0, 60);
      screen.println("X: ");
      screen.setCursor(30, 60);
      screen.println( x );
      // Accelemeter ADXL345 Y
      screen.setCursor(0, 90);
      screen.println( "Y: " );
      screen.setCursor(30, 90);
      screen.println( y );
      // Accelemeter ADXL345 Z
      screen.setCursor(0, 120);
      screen.println( "Z: " );
      screen.setCursor(30, 120);
      screen.println( z );
      // Standard Gravity
      // Accelemeter ADXL345 Xg
      screen.setCursor(0, 150);
      screen.println( "Xg: " );
      screen.setCursor(40, 150);
      screen.println( ax );
      // Accelemeter ADXL345 Yg
      screen.setCursor(0, 180);
      screen.println( "Yg: " );
      screen.setCursor(40, 180);
      screen.println( ay );
      // Accelemeter ADXL345 Zg
      screen.setCursor(0, 210);
      screen.println( "Zg: " );
      screen.setCursor(40, 210);
      screen.println( az );
      
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("DL2501Mk03");
      Serial.println("Bluetooth Started! Ready to pair...");
      
      // Delay
      delay(100);
    
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Setup Accelemeter ADXL345
      isSetupADXL345();
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consultant

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2025
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Project #11: ESP32 – Bluetooth IoT – Mk12

    ——

    #DonLucElectronics #DonLuc #ESP32 #Bluetooth #Elecrow #DFRobot #Arduino #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    Bluetooth IoT

    ——

    Bluetooth IoT

    ——

    Bluetooth IoT

    ——

    Bluetooth

    Bluetooth is a short-range wireless technology standard that is used for exchanging data between fixed and mobile devices over short distances and building personal area networks. In the most widely used mode, transmission power is limited to 2.5 milliwatts, giving it a very short range of up to 10 metres. It employs UHF radio waves in the ISM bands, from 2.402 GHz to 2.48 GHz.

    You can pair all kinds of Bluetooth devices with your PC, including keyboards, mice, phones, speakers, IoT, and a whole lot more. To do this, your PC needs to have Bluetooth. Some PCs, such as laptops and tablets, have Bluetooth built in. If your PC doesn’t, you can plug a USB Bluetooth adapter into the USB port on your PC to get it.

    DL2501Mk01

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0″ 320×240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail- Rotary Angle Sensor 2.0 – 10K Ohm
    1 x Crowtail- LED 2.0 – Yellow
    1 x Crowtail- LED 2.0 – Green
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal for Windows 10
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    POT – A0
    LEG – 16
    LEY – 17
    DC – D2
    CS – D6
    RST – D3
    RX2 – Bluetooth
    TX2 – Bluetooth
    VIN – +3.3V
    GND – GND

    DL2501Mk01p

    DL2501Mk01p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Project #11: ESP32 - Bluetooth IoT - Mk12
    11-12
    DL2501Mk01p.ino
    DL2501Mk01
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Fermion: 2.0" 320x240 IPS TFT LCD
    1 x GDL Line 10 CM
    1 x Crowtail- Rotary Angle Sensor 2.0 - 10K Ohm
    1 x Crowtail- LED 2.0 - Yellow
    1 x Crowtail- LED 2.0 - Green
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x Bluetooth Serial Terminal for Windows 10
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // Arduino
    #include <Arduino.h>
    // Wire
    #include <Wire.h>
    // DFRobot Display GDL API
    #include <DFRobot_GDL.h>
    // Bluetooth Serial
    #include "BluetoothSerial.h"
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    
    // Bluetooth Serial
    BluetoothSerial SerialBT;
    
    // Defined ESP32
    #define TFT_DC  D2
    #define TFT_CS  D6
    #define TFT_RST D3
    
    /*dc=*/ /*cs=*/ /*rst=*/
    // DFRobot Display 240x320
    DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);
    
    // Potentiometer
    int iPot = A0;
    int iPotVal = 0;
    // Change Your Threshold Here
    int Threshold = 2000;
    // Full String
    String FullString = "";
    
    // LED Yellow
    int iLEDY = 17;
    
    // LED Green
    int iLEDG = 16;
    
    // Software Version Information
    String sver = "11-12";
    
    void loop() {
    
      // Potentiometer
      isPotentiometer();
    
      // Delay 2 Second
      delay( 2000 );
    
    }
    

    getDisplay.ino

    // DFRobot Display 240x320
    // DFRobot Display 240x320 - UID
    void isDisplayUID(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Mono 9pt
      screen.setFont(&FreeMono9pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // DFRobot Display
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // Don Luc Electronics
      screen.setCursor(0, 60);
      screen.println("DFRobot Display");
      // Version
      screen.setCursor(0, 90);
      screen.println("Version");
      screen.setCursor(0, 120);
      screen.println( sver );
    
    }
    // isDisplay Green
    void isDisplayG(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Mono 9pt
      screen.setFont(&FreeMono9pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // LED Yellow
      screen.setCursor(0, 60);
      screen.println("LED Green");
      // Potentiometer Value
      screen.setCursor(0, 90);
      screen.println( iPotVal );
    
    }
    // isDisplay Yellow
    void isDisplayY(){
    
      // DFRobot Display 240x320
      // Text Display
      // Text Wrap
      screen.setTextWrap(false);
      // Rotation
      screen.setRotation(3);
      // Fill Screen => black
      screen.fillScreen(0x0000);
      // Text Color => white
      screen.setTextColor(0xffff);
      // Font => Free Mono 9pt
      screen.setFont(&FreeMono9pt7b);
      // TextSize => 1.5
      screen.setTextSize(1.5);
      // Don Luc Electronics
      screen.setCursor(0, 30);
      screen.println("Don Luc Electronics");
      // LED Yellow
      screen.setCursor(0, 60);
      screen.println("LED Yellow");
      // Potentiometer Value
      screen.setCursor(0, 90);
      screen.println( iPotVal );
    
    }
    

    getPotentiometer.ino

    // Potentiometer
    // Potentiometer
    void isPotentiometer(){
    
      // Connect Potentiometer to Analog 0
      iPotVal = analogRead( iPot );
    
      // Threshold
      if (iPotVal > Threshold) {
    
        // LED Yellow
        digitalWrite(iLEDY, LOW);
        // isDisplay Green
        isDisplayG();
        // LED Green
        digitalWrite(iLEDG, HIGH);
        // FullString
        FullString = "LED Green = " + String(iPotVal) + "\r\n";
      
      }
      else {
        
        // LED Green
        digitalWrite(iLEDG, LOW);
        // isDisplay Yellow
        isDisplayY();
        // LED Yellow
        digitalWrite(iLEDY, HIGH);
        // FullString
        FullString = "LED Yellow = " + String(iPotVal) + "\r\n";
        
      }
    
      // FullString Bluetooth Serial + Serial
      for(int i = 0; i < FullString.length(); i++)
      {
    
        // Bluetooth Serial
        SerialBT.write(FullString.c_str()[i]);
        // Serial
        Serial.write(FullString.c_str()[i]);
        
      }
    
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Serial Begin
      Serial.begin(115200);
      Serial.println("Starting BLE work!");
    
      // Bluetooth Serial
      SerialBT.begin("Don Luc Electronics");
      Serial.println("Bluetooth Started! Ready to pair...");
      
      // Delay
      delay(100);
    
      // DFRobot Display 240x320
      screen.begin();
    
      // Delay
      delay(100);
    
      // Initialize the LED Yellow
      pinMode(iLEDY, OUTPUT);
    
      // Initialize the LED Green
      pinMode(iLEDG, OUTPUT);
    
      // DFRobot Display 240x320 - UID
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consulting

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2024
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    Patreon: Intermediate

    ——

    #DonLucElectronics #DonLuc #ESP8266 #ESP32 #Arduino #Elecrow #Project #Patreon #Electronics #Microcontrollers #IoT #Fritzing #Programming #Consultant

    ——

    Patreon: Intermediate

    ——

    Patreon: Intermediate

    ——

    Patreon: Intermediate

    ——

    Patreon: Intermediate

    Intermediate: Internet of Things (IoT). Internet of Things (IoT) describes devices with sensors, processing ability, software and other technologies that connect and exchange data with other devices and systems over the Internet or other communication networks.

    Internet of Things (IoT)

    Internet of Things (IoT), the vast array of physical objects equipped with sensors and software that enable them to interact with little human intervention by collecting and exchanging data via a network. The Internet of Things (IoT) includes the many “Smart”, computer-like devices so commonplace today, which can connect with the Internet or interact via wireless networks; these “Things” include phones, appliances, thermostats, lighting systems, irrigation systems, security cameras, vehicles, even animals and cities. Today, smart watches track exercise and steps, smart speakers add items to shopping lists and switch lights on and off, and transponders allow cars to pass through tollbooths and pay the fee electronically.

    Espressif Systems

    Espressif Systems, a company with headquarters in Shanghai, China made its debut in the microcontroller scene with their range of inexpensive and feature-packed WiFi microcontrollers.

    ESP8266

    The ESP8266 is a low-cost Wi-Fi microcontroller, with built-in TCP/IP networking software, and microcontroller capability.

    Programming

    Arduino — A C++-based firmware. With this core, the ESP8266 CPU and its Wi-Fi components can be programmed like any other Arduino device.

    ESP32

    ESP32 is a series of low-cost, low-power system-on-chip microcontrollers with integrated Wi-Fi and dual-mode Bluetooth. The ESP32 series employs either a Tensilica Xtensa LX6 microprocessor in both dual-core and single-core variations, an Xtensa LX7 dual-core microprocessor, or a single-core RISC-V microprocessor.

    Programming

    Arduino – A C++-based firmware. With this core, Arduino core for the ESP32, ESP32-S2, ESP32-S3, ESP32-C3, Etc.

    DL2412Mk02

    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Crowtail- Rotary Angle Sensor 2.0 – 10K Ohm
    1 x Crowtail- OLED
    1 x Crowtail- LED 2.0 – Yellow
    1 x Crowtail- LED 2.0 – Green
    1 x Lithium Ion Battery – 1000mAh
    1 x Switch
    1 x USB 3.1 Cable A to C

    FireBeetle 2 ESP32-E

    POT – A0
    LEG – 16
    LEY – 17
    SCL – 22
    SDA – 21
    VIN – +3.3V
    GND – GND

    ——

    DL2412Mk02p

    DL2412Mk02p.ino

    /****** Don Luc Electronics © ******
    Software Version Information
    Patreon: Intermediate
    Intermediate
    DL2412Mk02p.ino
    DL2412Mk02
    1 x DFRobot FireBeetle 2 ESP32-E
    1 x Crowtail- Rotary Angle Sensor 2.0 - 10K Ohm
    1 x Crowtail- OLED
    1 x Crowtail- LED 2.0 - Yellow
    1 x Crowtail- LED 2.0 - Green
    1 x Lithium Ion Battery - 1000mAh
    1 x Switch
    1 x USB 3.1 Cable A to C
    */
    
    // Include the Library Code
    // Arduino
    #include <Arduino.h>
    // Crowtail- OLED
    #include <U8x8lib.h>
    // SPI
    #include <SPI.h>
    
    // Crowtail- OLED
    // U8x8 Contructor List 
    U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
    
    // Potentiometer
    int iPot = A0;
    int iPotVal = 0;
    // Change Your Threshold Here
    int Threshold = 2000;
    
    // LED Yellow
    int iLEDY = 17;
    
    // LED Green
    int iLEDG = 16;
    
    // Software Version Information
    String sver = "Intermediate";
    
    void loop() {
    
      // Potentiometer
      isPotentiometer();
    
      // Delay 0.5 Second
      delay( 500 );
    
    }
    

    getDisplay.ino

    // getDisplay
    // Crowbits-OLED 128X64 UID
    void isDisplayUID(){
    
      // Clear
      u8x8.clear();
      // Font
      u8x8.setFont(u8x8_font_chroma48medium8_r);
      // Draw
      u8x8.drawString(0,0,"Don Luc Electron");
      // Draw
      u8x8.drawString(0,35,"Intermediate");
    
    }
    // isDisplay Green
    void isDisplayG(){
    
      // Clear
      u8x8.clear();
      // Font
      u8x8.setFont(u8x8_font_chroma48medium8_r);
      // Cursor
      u8x8.setCursor(0,0);
      // Print
      u8x8.print("Don Luc Electron");
      // Cursor
      u8x8.setCursor(0,30);
      // Print
      u8x8.print("LED Green");
      // Cursor
      u8x8.setCursor(0,35);
      // Print
      u8x8.print(iPotVal);
      
    }
    // isDisplay Yellow
    void isDisplayY(){
    
      // Clear
      u8x8.clear();
      // Font
      u8x8.setFont(u8x8_font_chroma48medium8_r);
      // Cursor
      u8x8.setCursor(0,0);
      // Print
      u8x8.print("Don Luc Electron");
      // Cursor
      u8x8.setCursor(0,30);
      // Print
      u8x8.print("LED Yellow");
      // Cursor
      u8x8.setCursor(0,35);
      // Print
      u8x8.print(iPotVal);
    
    }
    

    getPotentiometer.ino

    // Potentiometer
    // Potentiometer
    void isPotentiometer(){
    
      // Connect Potentiometer to Analog 0
      iPotVal = analogRead( iPot );
    
      // Threshold
      if (iPotVal > Threshold) {
    
        // LED Yellow
        digitalWrite(iLEDY, LOW);
        // isDisplay Green
        isDisplayG();
        // LED Green
        digitalWrite(iLEDG, HIGH);
        
      }
      else {
        
        // LED Green
        digitalWrite(iLEDG, LOW);
        // isDisplay Yellow
        isDisplayY();
        // LED Yellow
        digitalWrite(iLEDY, HIGH);
        
      }
    
    }
    

    setup.ino

    // Setup
    void setup()
    {
     
      // Delay
      delay(100);
    
      // Crowtail- OLED
      u8x8.begin();
      u8x8.setPowerSave(0);
    
      // Delay
      delay(100);
    
      // Initialize the LED Yellow
      pinMode(iLEDY, OUTPUT);
    
      // Initialize the LED Green
      pinMode(iLEDG, OUTPUT);
    
      // Crowbits-OLED 128X64
      // Don Luc Electronics
      // Version
      isDisplayUID();
    
      // Delay 5 Second
      delay( 5000 );
    
    }
    

    ——

    People can contact us: https://www.donluc.com/?page_id=1927

    Electronics, IoT, Teacher, Instructor, R&D and Consulting

    • Programming Language
    • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
    • IoT
    • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
    • Robotics
    • Automation
    • Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
    • Unmanned Vehicles Terrestrial and Marine
    • Machine Learning
    • Artificial Intelligence (AI)
    • RTOS
    • Sensors, eHealth Sensors, Biosensor, and Biometric
    • Research & Development (R & D)
    • Consulting

    Follow Us

    Luc Paquin – Curriculum Vitae – 2024
    https://www.donluc.com/luc/

    Web: https://www.donluc.com/
    Facebook: https://www.facebook.com/neosteam.labs.9/
    YouTube: https://www.youtube.com/@thesass2063
    Twitter: https://twitter.com/labs_steam
    Pinterest: https://www.pinterest.com/NeoSteamLabs/
    Instagram: https://www.instagram.com/neosteamlabs/
    Patreon: https://patreon.com/DonLucElectronics59
    DFRobot: https://learn.dfrobot.com/user-10186.html
    Hackster.io: https://www.hackster.io/neosteam-labs
    Elecrow: https://www.elecrow.com/share/sharepj/center/no/760816d385ebb1edc0732fd873bfbf13
    TikTok: https://www.tiktok.com/@luc.paquin8
    Twitch: https://www.twitch.tv/lucpaquin
    LinkedIn: https://www.linkedin.com/in/jlucpaquin/

    Don Luc

    1 2 3 5
    Categories
    Archives