Welcome, Guest
You have to register before you can post on our site.

Username
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 9,133
» Latest member: Calabrisi
» Forum threads: 4,063
» Forum posts: 20,402

Full Statistics

Online Users
There are currently 38 online users.
» 0 Member(s) | 26 Guest(s)
Amazonbot, Applebot, Bytespider, PetalBot, bot

Latest Threads
Kincony A32 Pro - Remove ...
Forum: KC868-A32/A32 Pro
Last Post: admin
Today, 01:03 AM
» Replies: 3
» Views: 851
KC868-A32 PCB layout CAD ...
Forum: Schematic & diagram & Dimensions of KinCony PCB layout CAD file
Last Post: admin
Yesterday, 11:44 AM
» Replies: 0
» Views: 16
Help with Product Slectio...
Forum: Suggestions and feedback on KinCony's products
Last Post: admin
Yesterday, 10:35 AM
» Replies: 9
» Views: 592
Input real isolation
Forum: KC868-AI
Last Post: admin
Yesterday, 10:35 AM
» Replies: 3
» Views: 34
KC868-A8 OpenPLC Function...
Forum: KC868-A8
Last Post: admin
Yesterday, 12:50 AM
» Replies: 0
» Views: 20
KinCony Pi5M16 – Raspberr...
Forum: News
Last Post: admin
Yesterday, 12:00 AM
» Replies: 0
» Views: 21
KinCony Pi5R16 – Raspberr...
Forum: News
Last Post: admin
06-04-2026, 12:59 PM
» Replies: 0
» Views: 13
E16v3 - CE
Forum: Suggestions and feedback on KinCony's products
Last Post: admin
06-04-2026, 12:53 PM
» Replies: 9
» Views: 499
B4 Smart Controller Wirin...
Forum: B4
Last Post: admin
06-04-2026, 11:55 AM
» Replies: 4
» Views: 145
M30 Power Factor
Forum: KC868-M16 / M1 / MB / M30
Last Post: admin
06-03-2026, 12:37 PM
» Replies: 1
» Views: 56

  trying to flash the kc868 A16
Posted by: wdiechmann - 09-15-2025, 09:24 AM - Forum: KC868-A series and Uair Smart Controller - Replies (3)

I am literally in kindergarten  
Sad
I finally got som help from a friend to flash the KC868 A16 with v2.2 firmware (version number major 2 but the .2 i am not so sure about). That left me with the A16 responding on HTTP - so I can see settings, network, and stuff - and I have both an ethernet connection and a WiFi connection working (the A16 responding to GET requests on both IP Addresses). I am macOS (M4) user and I run most everything in Docker containers on a Synology NAS, so I had to ask for help to upgrade the firmware from PC.

I have used the yaml I found in this forum - https://www.kincony.com/forum/showthread.php?tid=1772 - with changes to network to match my situation.

But when I try to write that configuration yaml - the output is always an error. Whether a 111 or this:

Code:
Successfully created ESP32 image.
merge_factory_bin([".pioenvs/kincony/firmware.bin"], [".pioenvs/kincony/firmware.elf"])
Info: bootloader.bin not found - skipping
Info: partition-table.bin not found - skipping
Info: ota_data_initial.bin not found - skipping
Info: kincony.bin not found - skipping
Using FLASH_EXTRA_IMAGES from PlatformIO environment
Merging binaries into /config/.esphome/build/kincony/.pioenvs/kincony/firmware.factory.bin
Merging binaries with esptool
SHA digest in image updated.
Wrote 0x7ed80 bytes to file '/config/.esphome/build/kincony/.pioenvs/kincony/firmware.factory.bin', ready to flash to offset 0x0.
Successfully created /config/.esphome/build/kincony/.pioenvs/kincony/firmware.factory.bin
esp32_copy_ota_bin([".pioenvs/kincony/firmware.bin"], [".pioenvs/kincony/firmware.elf"])
Copied firmware to /config/.esphome/build/kincony/.pioenvs/kincony/firmware.ota.bin
========================= [SUCCESS] Took 26.04 seconds =========================
INFO Package configuration completed successfully
INFO Package configuration completed successfully
INFO Successfully compiled program.
INFO Uploading to 10.4.3.33
ERROR Cannot upload Over the Air as the ota configuration is not present or does not include platform: esphome

Print this item

  KinCony AIO Hybrid ALL IN ONE controller rleased
Posted by: admin - 09-15-2025, 01:48 AM - Forum: News - Replies (2)

KinCony AIO Hybrid ESP32 smart controller based on ESP32-S3-WROOM-1U (N16R8) wifi chip. It's ALL IN ONE module. It have 5 manual control switch buttons can turn ON/OFF relay even if system is broken. 5 channel removable OMRON high-quality relay, 2 free GPIOs use for LED strip, such as WS2812B LED strip. 4 channel analog input ports. One SD card using SPI bus. KinCony AIO Hybrid include DS3231 high precision RTC clock chip. OLED display will show wifi and ethernet IP address and Tuya connection state. AIO Hybrid have RS485 port and RF433MHz RF receiver. 4 channel DAC 0-10v output user for dimmer or control motor speed. Tuya APP support work with IR and RF 433MHz devices. IR receiver use for ESP32 and Tuya module. Two IR senders use for ESP32S3 module and Tuya module.
[Image: AIO-Hybrid-1.jpg]
You can define RF and IR buttons to control TV or air conditioner or other IR devices by IR signal.
AIO Hybrid can pair with zigbee3.0 standard protocol products. create IFTTT command for zigbee sensor, so that zigbee sensor automatic send command to relay board or other devices using customize command.
[Image: AIO-Hybrid-2.jpg]
You can write any code by Arduino IDE / MicroPython / ESP-IDF development tool to ESP32 module. We will supply Arduino / ESP-IDF demo code for different samples. Everyone can modify and change the code for your own smart home automation system project. it support use by ESPHome for home assistant or tasmota firmware for smart home automation DIY. AIO Hybrid use KCS v3 firmware, it support home assistant auto discovery function by MQTT, so without write any config code (zero code) for home assistant.
Model No. KinCony AIO Hybrid
Description: KinCony ALL IN ONE ESP32-S3 Controller – AIO Hybrid
Power supply: 12/24V DC (Default install by 12V OMRON relay)
Processor: ESP32-S3-WROOM-1U (N16R8)
Size: 218mm*127mm*64mm
interfaces: Ethernet(RJ45)-LAN 100Mbps IPv4/IPv6,WiFi,RS485,Bluetooth,USB-C,OLED, Tuya Module,Zigbee
RTC: DS3231 high precision chip (battery socket on PCB)
SD Card: SPI bus
Installation method: DIN RAIL
OLED: SSD1306 I2C display
Outputs:
5CH OMRON removable relay, every channel have "COM"(common) and "NO"(normal open) ports.
MAX load 250VAC/16A 30VDC/16A
4CH DAC 0-10V output
Tuya IR sender
ESP32S3 IR sender
Tuya RF433MHz sender
Inputs:
4CH analog input DC0-5V (A1,A2) 2CH analog input 4-20mA (A3,A4)
12CH dry contact inputs (optocoupler isolation, long distance circuit for MAX 500 meters cable)
3 buttons: 1:ESP32 Reset 2:ESP32 Download 3:Tuya relay config, 4:Tuya IR/RF module config
free GPIO: 2CH (without pull-up resistance on PCB, connect with ESP32 pin directly)
RF receiver socket: 433MHz RF receiver
Tuya RF433MHz receiver
[Image: AIO-Hybrid_diagram.jpg]

Print this item

  [arduino code examples for AIO Hybrid]-13 RF433M receiver
Posted by: admin - 09-15-2025, 01:40 AM - Forum: AIO Hybrid - No Replies

Code:
/*
  Simple example for receiving
 
  https://github.com/sui77/rc-switch/
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(digitalPinToInterrupt(40));
  Serial.print("begin test");
}

void loop() {
  if (mySwitch.available()) {
   
    Serial.print("Received ");
    Serial.print( mySwitch.getReceivedValue() );
    Serial.print(" / ");
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print("bit ");
    Serial.print("Protocol: ");
    Serial.println( mySwitch.getReceivedProtocol() );

    mySwitch.resetAvailable();
  }
}
arduino ino file download:

.zip   13-433-decode.zip (Size: 457 bytes / Downloads: 361)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   13-433-decode.ino.merged.zip (Size: 185.99 KB / Downloads: 369)
   

Print this item

  [arduino code examples for AIO Hybrid]-12 DAC MCP4728 analog output
Posted by: admin - 09-15-2025, 01:39 AM - Forum: AIO Hybrid - No Replies

Code:
// Basic demo for configuring the MCP4728 4-Channel 12-bit I2C DAC
#include <Adafruit_MCP4728.h>
#include <Wire.h>

// I2C pin definitions
#define I2C_SDA 8
#define I2C_SCL 18

Adafruit_MCP4728 mcp;

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MCP4728 test!");

  Wire.begin(I2C_SDA, I2C_SCL);

  // Try to initialize!
  if (!mcp.begin()) {
    Serial.println("Failed to find MCP4728 chip");
    while (1) {
      delay(10);
    }
  }

  mcp.setChannelValue(MCP4728_CHANNEL_A, 4095);
  mcp.setChannelValue(MCP4728_CHANNEL_B, 2048);
  mcp.setChannelValue(MCP4728_CHANNEL_C, 1024);
  mcp.setChannelValue(MCP4728_CHANNEL_D, 0);
}

void loop() { delay(1000); }
arduino ino file download:

.zip   12-DAC-MCP4728.zip (Size: 566 bytes / Downloads: 356)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   12-DAC-MCP4728.ino.merged.zip (Size: 198.76 KB / Downloads: 362)

Print this item

  [arduino code examples for AIO Hybrid]-11 IR send and receive
Posted by: admin - 09-15-2025, 01:37 AM - Forum: AIO Hybrid - No Replies

Code:
/*
* SimpleReceiver.cpp
*
* Demonstrates receiving ONLY NEC protocol IR codes with IRremote
* If no protocol is defined, all protocols (except Bang&Olufsen) are active.
*
*  This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
*
************************************************************************************
* MIT License
*
* Copyright (c) 2020-2025 Armin Joachimsmeyer
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
************************************************************************************
*/

#include <Arduino.h>
#include <IRremote.hpp> // include the library


uint8_t receiver_pin = 17;

void setup() {
    Serial.begin(115200);
    IrReceiver.begin(receiver_pin, false);
}

void loop() {
  if (IrReceiver.decode()) {
      Serial.println("recv data");
      if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
          Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
          // We have an unknown protocol here, print extended info
          IrReceiver.printIRResultRawFormatted(&Serial, true);

          IrReceiver.resume(); // Do it here, to preserve raw data for printing with printIRResultRawFormatted()
      } else {
          IrReceiver.resume(); // Early enable receiving of the next IR frame

          IrReceiver.printIRResultShort(&Serial);
          IrReceiver.printIRSendUsage(&Serial);
      }
  } else {
    // Serial.println("no data");
  }
}
arduino ino file download:

.zip   11-SimpleSendReceiver.zip (Size: 1.31 KB / Downloads: 389)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   11-SimpleSendReceiver.ino.merged.zip (Size: 197.43 KB / Downloads: 359)

Print this item

  [arduino code examples for AIO Hybrid]-10 Print TEXT on SSD1306 OLED displayer
Posted by: admin - 09-15-2025, 01:36 AM - Forum: AIO Hybrid - No Replies

Code:
/*
* Made by KinCony IoT: https://www.kincony.com
*
* This Arduino program demonstrates how to display text on an SSD1306 128x64 OLED display using the U8g2 library.
* The program draws two lines of text on the display:
* - The first line is "KINCONY" in a larger font.
* - The second line is "www.kincony.com" in a smaller font.
*
* The display is connected via I2C (software implementation) with:
* - SCL (clock) on pin IO18
* - SDA (data) on pin IO8
*
* The display's I2C address is set to 0x3C.
*/

#include <U8g2lib.h>  // Include the U8g2 library for controlling the OLED display
#include <Wire.h>     // Include the Wire library for I2C communication

// Initialize the display using the software I2C method (SCL = IO18, SDA = IO8)
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,  18, 8, U8X8_PIN_NONE);  // Screen rotation: U8G2_R0

// Function to display page 1 content
void page1() {
  // Set font size 18 for the larger "KINCONY" text
  u8g2.setFont(u8g2_font_timR18_tf);  // Use the Times Roman font, size 18
  u8g2.setFontPosTop();               // Set the text position at the top of the display
  u8g2.setCursor(5, 0);               // Position the cursor at coordinates (5, 0)
  u8g2.print("KINCONY");              // Display the text "KINCONY" on the screen

  // Set font size 12 for the smaller "www.kincony.com" text
  u8g2.setFont(u8g2_font_timR12_tf);  // Use the Times Roman font, size 12
  u8g2.setCursor(0, 40);              // Position the cursor at coordinates (0, 40)
  u8g2.print("www.kincony.com");      // Display the text "www.kincony.com"
}

// Setup function, runs once when the program starts
void setup() {
  // Set the I2C address for the display to 0x3C
  u8g2.setI2CAddress(0x3C*2);  // I2C address shift for 8-bit format
 
  // Initialize the display
  u8g2.begin();
 
  // Enable UTF-8 character printing for the display
  u8g2.enableUTF8Print();  // Allow UTF-8 encoded text to be printed
}

// Main loop function, continuously runs after setup()
void loop() {
  // Begin the display drawing process
  u8g2.firstPage();  // Prepare the first page for drawing
  do {
    // Call the page1() function to draw content on the display
    page1();
  } while (u8g2.nextPage());  // Continue to the next page until all pages are drawn
}
arduino ino file download:

.zip   10-oled-ssd1306.zip (Size: 1.11 KB / Downloads: 366)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   10-oled-ssd1306.ino.merged.zip (Size: 201.24 KB / Downloads: 344)

Print this item

  [arduino code examples for AIO Hybrid]-09 how to communication with Tuya Zigbee modul
Posted by: admin - 09-15-2025, 01:35 AM - Forum: AIO Hybrid - No Replies

Code:
#define TUYA_RXD 15
#define TUYA_TXD 48

void setup() {
  Serial0.begin(115200);  // Serial0
  while (!Serial0);

  Serial2.begin(115200, SERIAL_8N1, TUYA_RXD, TUYA_TXD);
  delay(100);

  byte tuya_cmd[] = {0x55, 0xAA, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04};
  Serial0.println("send data to Tuya module:");
  for (int i = 0; i < sizeof(tuya_cmd); i++) {
    Serial0.printf("%02X ", tuya_cmd[i]);
    Serial2.write(tuya_cmd[i]);
  }
  Serial0.println();
}

void loop() {
  if (Serial2.available()) {
    Serial0.print("received from tuya: ");
    while (Serial2.available()) {
      byte b = Serial2.read();
      Serial0.printf("%02X ", b);
    }
    Serial0.println();
  }

  delay(100);
}
arduino ino file download:

.zip   9-Zigbee-ZSU.zip (Size: 496 bytes / Downloads: 333)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   9-Zigbee-ZSU.ino.merged.zip (Size: 190.24 KB / Downloads: 336)

Print this item

  [arduino code examples for AIO Hybrid]-08 Ethernet W5500 chip work with TCP Server mo
Posted by: admin - 09-15-2025, 01:32 AM - Forum: AIO Hybrid - No Replies

Code:
/*
* Made by KinCony IoT: https://www.kincony.com
*
* This Arduino program sets up an ESP32-S3 with a W5500 Ethernet module
* as a TCP server. It listens on port 4196 and echoes back any string
* received from a client.
*
* Hardware connections:
* - CLK: GPIO42
* - MOSI: GPIO43
* - MISO: GPIO44
* - CS: GPIO41
* - RST: GPIO1
* - INT: GPIO2
*
* Static IP address: 192.168.3.55
* Subnet Mask: 255.255.255.0
* Gateway: 192.168.3.1
* DNS: 192.168.3.1
*/

#include <SPI.h>
#include <Ethernet.h>

// Define the W5500 Ethernet module pins
#define W5500_CS_PIN  41
#define W5500_RST_PIN 1
#define W5500_INT_PIN 2
#define W5500_CLK_PIN 42
#define W5500_MOSI_PIN 43
#define W5500_MISO_PIN 44

// MAC address for your Ethernet shield (must be unique on your network)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Static IP address configuration
IPAddress ip(192, 168, 3, 55);       // Static IP address
IPAddress subnet(255, 255, 255, 0);   // Subnet mask
IPAddress gateway(192, 168, 3, 1);    // Default gateway
IPAddress dns(192, 168, 3, 1);        // DNS server address

// Create an EthernetServer object to handle TCP connections
EthernetServer server(4196);

void setup() {
  // Initialize serial communication
  Serial.begin(115200);
  while (!Serial) {
    ; // Wait for serial port to connect
  }

  // Initialize the W5500 module
  pinMode(W5500_RST_PIN, OUTPUT);
  pinMode(W5500_INT_PIN, INPUT);
  digitalWrite(W5500_RST_PIN, LOW);  // Reset the W5500 module
  delay(100);                       // Wait for reset to complete
  digitalWrite(W5500_RST_PIN, HIGH); // Release reset

  // Initialize SPI with the correct pin definitions
  SPI.begin(W5500_CLK_PIN, W5500_MISO_PIN, W5500_MOSI_PIN);

  // Set up the Ethernet library with W5500-specific pins
  Ethernet.init(W5500_CS_PIN);

  // Start the Ethernet connection with static IP configuration
  Ethernet.begin(mac, ip, dns, gateway, subnet);

  // Print the IP address to the serial monitor
  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());

  // Start listening for incoming TCP connections
  server.begin();
}

void loop() {
  // Check for incoming client connections
  EthernetClient client = server.available();
  if (client) {
    Serial.println("New client connected");

    // Read data from the client and echo it back
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        server.write(c);
      }
    }

    // Close the connection when done
    client.stop();
    Serial.println("Client disconnected");
  }
}
arduino ino file download:

.zip   8-Ethernet-W5500.zip (Size: 1.23 KB / Downloads: 345)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   8-Ethernet-W5500.ino.merged.zip (Size: 188.93 KB / Downloads: 354)

Print this item

  [arduino code examples for AIO Hybrid]-07 how to DS3231 RTC clock
Posted by: admin - 09-15-2025, 01:31 AM - Forum: AIO Hybrid - No Replies

Code:
/*
* Made by KinCony IoT: https://www.kincony.com
*
* DS3231 RTC with Arduino
*
* This program demonstrates how to use the DS3231 RTC (Real-Time Clock) module with the Arduino.
* It includes functionality to:
* - Initialize the DS3231 RTC module
* - Read the current date and time from the RTC
* - Set the RTC time based on a serial command:Command format: DYYYY-MM-DDTHH:MM:SS
*
* Hardware Connections:
* - SDA: GPIO 8
* - SCL: GPIO 18
*/

#include <DS3231.h>
#include <Wire.h>

String serial_cmd_rcv = ""; // Serial port receiver

typedef struct
{
  byte year;    // Last two digits of the year, library adds 2000.
  byte month;
  byte day;
  byte hour;
  byte minute;
  byte second;
} MY_DATE_STR;

MY_DATE_STR my_date_str = {0};

// Define constants for relay control
#define OPEN_RLY_DATA    26
#define OPEN_RLY_MONTH   4
#define CLOSE_RLY_DATA   2
#define CLOSE_RLY_MONTH  5

// Define pin connections
#define SDA_PIN   8
#define SCL_PIN   18

DS3231 rtc; // Create an instance of the DS3231 RTC
bool h12Flag;
bool pmFlag;
static bool bCentury = false;
static bool old_level_high = false;
static bool old_level_low = false;


/**
* @brief Print the current time from the RTC to the Serial Monitor.
*/
static void PrintfCurTime()
{
  Serial.print("Current time is: ");
  int year = rtc.getYear() + 2000;
  Serial.print(year);
  Serial.print("-");

  Serial.print(rtc.getMonth(bCentury), DEC);
  Serial.print("-");

  Serial.print(rtc.getDate(), DEC);
  Serial.print(" ");

  Serial.print(rtc.getHour(h12Flag, pmFlag), DEC);
  Serial.print(":");
  Serial.print(rtc.getMinute(), DEC);
  Serial.print(":");
  Serial.println(rtc.getSecond(), DEC);
}

/**
* @brief Process serial commands to set the RTC time.
* Command format: DYYYY-MM-DDTHH:MM:SS
*/
static void GetSerialCmd()
{
  if (Serial.available() > 0)
  {
    delay(100);
    int num_read = Serial.available();
    while (num_read--)
      serial_cmd_rcv += char(Serial.read());
  }
  else return;

  serial_cmd_rcv.trim();

  if (serial_cmd_rcv == "current time")
  {
    PrintfCurTime();
    serial_cmd_rcv = "";
    return;
  }

  Serial.print("Received length: ");
  Serial.println(serial_cmd_rcv.length());

  int indexof_d = serial_cmd_rcv.indexOf('D');
  int indexof_t = serial_cmd_rcv.indexOf('T');

  Serial.print("D index: ");
  Serial.print(indexof_d);
  Serial.print(" T index: ");
  Serial.println(indexof_t);

  if (serial_cmd_rcv.length() != 20 ||
      serial_cmd_rcv.substring(0, 1) != "D" ||
      serial_cmd_rcv.substring(11, 12) != "T") 
  {
    Serial.println(serial_cmd_rcv);
    serial_cmd_rcv = "";
    return;
  }

  Serial.println("Setting time...");

  my_date_str.year = (byte)serial_cmd_rcv.substring(3, 5).toInt();
  my_date_str.month = (byte)serial_cmd_rcv.substring(6, 8).toInt();
  my_date_str.day = (byte)serial_cmd_rcv.substring(9, 11).toInt();
  my_date_str.hour = (byte)serial_cmd_rcv.substring(12, 14).toInt();
  my_date_str.minute = (byte)serial_cmd_rcv.substring(15, 17).toInt();
  my_date_str.second = (byte)serial_cmd_rcv.substring(18).toInt();

  rtc.setYear(my_date_str.year);
  rtc.setMonth(my_date_str.month);
  rtc.setDate(my_date_str.day);
  rtc.setHour(my_date_str.hour);
  rtc.setMinute(my_date_str.minute);
  rtc.setSecond(my_date_str.second);

  serial_cmd_rcv = "";

  Serial.println("Time set.");
}

void setup() {
  // Initialize the I2C interface
  Wire.begin(SDA_PIN, SCL_PIN, 40000);
 
  // Initialize Serial communication
  Serial.begin(115200);
   
  // Set the RTC to 24-hour mode
  rtc.setClockMode(false); // 24-hour format

  // Print current time to Serial Monitor
  PrintfCurTime();

  // Clear any remaining serial data
  while (Serial.read() >= 0) {}
}

void loop() {
  // Process incoming serial commands
  GetSerialCmd();
  delay(1000); // Delay for 1 second
}
arduino ino file download:

.zip   7-DS3231-RTC.zip (Size: 1.51 KB / Downloads: 341)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   7-DS3231-RTC.ino.merged.zip (Size: 198.29 KB / Downloads: 338)

Print this item

  [arduino code examples for AIO Hybrid]-06 How to use SD Card
Posted by: admin - 09-15-2025, 01:30 AM - Forum: AIO Hybrid - No Replies

Code:
/*
* Made by KinCony IoT: https://www.kincony.com
*
* SD Card File Operations
*
* This program demonstrates basic file operations on an SD card using the ESP32.
* It includes functionality to:
* - Initialize and test the SD card
* - Read from, write to, append to, and delete files on the SD card
* - Measure file read and write performance
*
* Hardware Connections:
* - SCK: GPIO 11
* - MISO: GPIO 12
* - MOSI: GPIO 10
* - CS: GPIO 9
*/

#include "FS.h"
#include "SD.h"
#include "SPI.h"

// Pin definitions for SD card
#define SCK  11
#define MISO 12
#define MOSI 10
#define CS   9

/**
* @brief Reads the contents of a file from the SD card and prints it to the serial monitor.
*
* @param fs File system to use (in this case, SD).
* @param path Path of the file to read.
*/
void readFile(fs::FS &fs, const char * path) {
  Serial.printf("Reading file: %s\n", path);

  File file = fs.open(path);
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }

  Serial.print("Read from file: ");
  while (file.available()) {
    Serial.print((char)file.read());
  }
  file.close();
}

/**
* @brief Writes a message to a file on the SD card.
*
* @param fs File system to use (in this case, SD).
* @param path Path of the file to write.
* @param message Message to write to the file.
*/
void writeFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if (file.print(message)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

/**
* @brief Appends a message to a file on the SD card.
*
* @param fs File system to use (in this case, SD).
* @param path Path of the file to append.
* @param message Message to append to the file.
*/
void appendFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if (!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if (file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

/**
* @brief Deletes a file from the SD card.
*
* @param fs File system to use (in this case, SD).
* @param path Path of the file to delete.
*/
void deleteFile(fs::FS &fs, const char * path) {
  Serial.printf("Deleting file: %s\n", path);
  if (fs.remove(path)) {
    Serial.println("File deleted");
  } else {
    Serial.println("Delete failed");
  }
}

/**
* @brief Tests file read and write performance.
*
* @param fs File system to use (in this case, SD).
* @param path Path of the file to test.
*/
void testFileIO(fs::FS &fs, const char * path) {
  File file = fs.open(path);
  static uint8_t buf[512];
  size_t len = 0;
  uint32_t start = millis();
  uint32_t end = start;

  if (file) {
    len = file.size();
    size_t flen = len;
    start = millis();
    while (len) {
      size_t toRead = len;
      if (toRead > 512) {
        toRead = 512;
      }
      file.read(buf, toRead);
      len -= toRead;
    }
    end = millis() - start;
    Serial.printf("%u bytes read for %u ms\n", flen, end);
    file.close();
  } else {
    Serial.println("Failed to open file for reading");
  }

  file = fs.open(path, FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  }

  size_t i;
  start = millis();
  for (i = 0; i < 2048; i++) {
    file.write(buf, 512);
  }
  end = millis() - start;
  Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
  file.close();
}

void setup() {
  // Initialize serial communication
  Serial.begin(115200);
 
  // Initialize SPI and SD card
  SPIClass spi = SPIClass(HSPI);
  spi.begin(SCK, MISO, MOSI, CS);

  if (!SD.begin(CS, spi, 80000000)) {
    Serial.println("Card Mount Failed");
    return;
  }

  uint8_t cardType = SD.cardType();

  if (cardType == CARD_NONE) {
    Serial.println("No SD card attached");
    return;
  }

  Serial.print("SD Card Type: ");
  if (cardType == CARD_MMC) {
    Serial.println("MMC");
  } else if (cardType == CARD_SD) {
    Serial.println("SDSC");
  } else if (cardType == CARD_SDHC) {
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }

  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);
  delay(2000);

  // Perform file operations
  deleteFile(SD, "/hello.txt");
  writeFile(SD, "/hello.txt", "Hello ");
  appendFile(SD, "/hello.txt", "World!\n");
  readFile(SD, "/hello.txt");
  testFileIO(SD, "/test.txt");
  Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
  Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}

void loop() {
  // No operation in loop
}
arduino ino file download:

.zip   6-SD.zip (Size: 1.53 KB / Downloads: 320)
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download:

.zip   6-SD.ino.merged.zip (Size: 221.05 KB / Downloads: 366)

Print this item