<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Smart Home Automation Forum - F8]]></title>
		<link>https://www.kincony.com/forum/</link>
		<description><![CDATA[Smart Home Automation Forum - https://www.kincony.com/forum]]></description>
		<pubDate>Sat, 24 Oct 2026 22:38:31 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[F8 ESPHome yaml for home assistant with tuya]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=9714</link>
			<pubDate>Mon, 03 Aug 2026 07:00:09 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=9714</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>esphome:<br />
  name: f8<br />
  friendly_name: f8<br />
  platformio_options:<br />
    board_build.extra_flags:<br />
      # WIFI_CONTROL_SELF_MODE = 0<br />
      # WIFI_CONTROL_SELF_MODE = 1<br />
      - "-DWIFI_CONTROL_SELF_MODE=1"<br />
esp32:<br />
  board: esp32-s3-devkitc-1<br />
  framework:<br />
    type: arduino<br />
    <br />
<br />
external_components:<br />
  - source:<br />
      type: git<br />
      url: https://github.com/hzkincony/esphome-tuya-wifi-mcu<br />
      ref: v1.3.1<br />
<br />
# Enable logging<br />
<br />
  # hardware_uart: USB_SERIAL_JTAG<br />
# Enable Home Assistant API<br />
api:<br />
  encryption:<br />
    key: "WeVOuL5oNhjXcfzXtTirlOwvtWvCD5yqIxd3oV4es1k="<br />
<br />
ethernet:<br />
  type: W5500<br />
  clk_pin: GPIO42<br />
  mosi_pin: GPIO43<br />
  miso_pin: GPIO44<br />
  cs_pin: GPIO41<br />
  interrupt_pin: GPIO2<br />
  reset_pin: GPIO1<br />
<br />
i2c:<br />
 &nbsp;&nbsp;- id: bus_a<br />
   &nbsp;&nbsp;sda: 8<br />
   &nbsp;&nbsp;scl: 18<br />
   &nbsp;&nbsp;scan: true<br />
   &nbsp;&nbsp;frequency: 400kHz<br />
<br />
pcf8574:<br />
  - id: 'pcf8574_hub_in_1'  # for DI1-DI4 Relay1-Relay4<br />
    i2c_id: bus_a<br />
    address: 0x24<br />
    pcf8575: true<br />
<br />
uart:<br />
  - id: uart_1    #RS485<br />
    baud_rate: 9600<br />
    debug:<br />
      direction: BOTH<br />
      dummy_receiver: true<br />
      after:<br />
        timeout: 10ms<br />
    tx_pin: 16<br />
    rx_pin: 17<br />
<br />
  - id: tuya_mcu_uart<br />
    tx_pin: GPIO39<br />
    rx_pin: GPIO38<br />
    baud_rate: 9600<br />
<br />
tuya_wifi_mcu:<br />
  # tuya mcu product id<br />
  product_id: gk6ok3aysk6lw1bb<br />
  uart_id: tuya_mcu_uart<br />
  wifi_reset_pin: 28<br />
  wifi_led_pin: 16<br />
<br />
switch:<br />
  - platform: uart<br />
    uart_id: uart_1<br />
    name: "RS485 Button"<br />
    data: [0x11, 0x22, 0x33, 0x44, 0x55]<br />
<br />
  - platform: gpio<br />
    name: "f8-output01"<br />
    id: "f8_output01"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 8<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output1-tuya<br />
    dp_id: 1<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output01"<br />
<br />
  - platform: gpio<br />
    name: "f8-output02"<br />
    id: "f8_output02"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 9<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output2-tuya<br />
    dp_id: 2<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output02"<br />
<br />
  - platform: gpio<br />
    name: "f8-output03"<br />
    id: "f8_output03"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 10<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output3-tuya<br />
    dp_id: 3<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output03"<br />
<br />
  - platform: gpio<br />
    name: "f8-output04"<br />
    id: "f8_output04"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 11<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output4-tuya<br />
    dp_id: 4<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output04"<br />
<br />
  - platform: gpio<br />
    name: "f8-output05"<br />
    id: "f8_output05"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 12<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output5-tuya<br />
    dp_id: 5<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output05"<br />
<br />
  - platform: gpio<br />
    name: "f8-output06"<br />
    id: "f8_output06"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 13<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output6-tuya<br />
    dp_id: 6<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output06"<br />
<br />
  - platform: gpio<br />
    name: "f8-output07"<br />
    id: "f8_output07"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 14<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output4-tuya<br />
    dp_id: 101<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output07"<br />
<br />
  - platform: gpio<br />
    name: "f8-output08"<br />
    id: "f8_output08"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 15<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output8-tuya<br />
    dp_id: 102<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output08"<br />
<br />
binary_sensor:<br />
  - platform: gpio<br />
    name: "f8-input01"<br />
    id: "f8_input01"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 0<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input1-tuya<br />
    dp_id: 111<br />
    bind_binary_sensor_id: f8_input01<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input02"<br />
    id: "f8_input02"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 1<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input2-tuya<br />
    dp_id: 112<br />
    bind_binary_sensor_id: f8_input02<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input03"<br />
    id: "f8_input03"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 2<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input3-tuya<br />
    dp_id: 113<br />
    bind_binary_sensor_id: f8_input03<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input04"<br />
    id: "f8_input04"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 3<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input4-tuya<br />
    dp_id: 114<br />
    bind_binary_sensor_id: f8_input04<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input05"<br />
    id: "f8_input05"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 4<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input5-tuya<br />
    dp_id: 115<br />
    bind_binary_sensor_id: f8_input05<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input06"<br />
    id: "f8_input06"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 5<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input6-tuya<br />
    dp_id: 116<br />
    bind_binary_sensor_id: f8_input06<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input07"<br />
    id: "f8_input07"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 6<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input7-tuya<br />
    dp_id: 117<br />
    bind_binary_sensor_id: f8_input07<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input08"<br />
    id: "f8_input08"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 7<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input8-tuya<br />
    dp_id: 118<br />
    bind_binary_sensor_id: f8_input08<br />
    internal: true<br />
<br />
##pull-up resistance on PCB<br />
  - platform: gpio<br />
    name: "f8-W1-io48"<br />
    pin: <br />
      number: 48<br />
      inverted: true<br />
<br />
  - platform: gpio<br />
    name: "f8-W1-io47"<br />
    pin: <br />
      number: 47<br />
      inverted: true<br />
<br />
  - platform: gpio<br />
    name: "f8-W1-io21"<br />
    pin: <br />
      number: 21<br />
      inverted: true<br />
<br />
  - platform: gpio<br />
    name: "f8-W1-io15"<br />
    pin: <br />
      number: 15<br />
      inverted: true<br />
## without resistance on PCB<br />
  - platform: gpio<br />
    name: "f8-W1-io14"<br />
    pin: <br />
      number: 14<br />
      inverted:  false<br />
<br />
  - platform: gpio<br />
    name: "f8-433M"<br />
    pin: <br />
      number: 40<br />
      inverted:  false<br />
<br />
  - platform: gpio<br />
    name: "f8-io0"<br />
    pin: <br />
      number: 0<br />
      inverted:  false<br />
<br />
sensor:<br />
  - platform: adc<br />
    pin: 5<br />
    name: "f8 A1 Voltage"<br />
    update_interval: 5s<br />
    attenuation: 11db<br />
    filters:<br />
      - lambda:<br />
          if (x &gt;= 3.11) {<br />
            return x * 1.60256;<br />
          } else if (x &lt;= 0.15) {<br />
            return 0;<br />
          } else {<br />
            return x * 1.51;<br />
          }<br />
  - platform: adc<br />
    pin: 7<br />
    name: "f8 A2 Voltage"<br />
    update_interval: 5s<br />
    attenuation: 11db<br />
    filters:<br />
      # - multiply: 1.51515<br />
      - lambda:<br />
          if (x &gt;= 3.11) {<br />
            return x * 1.60256;<br />
          } else if (x &lt;= 0.15) {<br />
            return 0;<br />
          } else {<br />
            return x * 1.51;<br />
          }<br />
  - platform: adc<br />
    pin: 6<br />
    name: "f8 A3 Current"<br />
    update_interval: 5s<br />
    unit_of_measurement: mA<br />
    attenuation: 11db<br />
    filters:<br />
      - multiply: 6.66666666<br />
  - platform: adc<br />
    pin: 4<br />
    name: "f8 A4 Current"<br />
    update_interval: 5s<br />
    unit_of_measurement: mA<br />
    attenuation: 11db<br />
    filters:<br />
      - multiply: 6.66666666<br />
<br />
web_server:<br />
  port: 80<br />
<br />
font:<br />
  - file: "gfonts://Roboto"<br />
    id: roboto<br />
    size: 20<br />
<br />
display:<br />
  - platform: ssd1306_i2c<br />
    i2c_id: bus_a<br />
    model: "SSD1306 128x64"<br />
    address: 0x3C<br />
    lambda: |-<br />
      it.printf(0, 0, id(roboto), "KinCony f8");</code></div></div>esphome yaml:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/txt.png" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10301" target="_blank" title="">F8-HA-tuya.txt</a> (Size: 8.68 KB / Downloads: 127)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>esphome:<br />
  name: f8<br />
  friendly_name: f8<br />
  platformio_options:<br />
    board_build.extra_flags:<br />
      # WIFI_CONTROL_SELF_MODE = 0<br />
      # WIFI_CONTROL_SELF_MODE = 1<br />
      - "-DWIFI_CONTROL_SELF_MODE=1"<br />
esp32:<br />
  board: esp32-s3-devkitc-1<br />
  framework:<br />
    type: arduino<br />
    <br />
<br />
external_components:<br />
  - source:<br />
      type: git<br />
      url: https://github.com/hzkincony/esphome-tuya-wifi-mcu<br />
      ref: v1.3.1<br />
<br />
# Enable logging<br />
<br />
  # hardware_uart: USB_SERIAL_JTAG<br />
# Enable Home Assistant API<br />
api:<br />
  encryption:<br />
    key: "WeVOuL5oNhjXcfzXtTirlOwvtWvCD5yqIxd3oV4es1k="<br />
<br />
ethernet:<br />
  type: W5500<br />
  clk_pin: GPIO42<br />
  mosi_pin: GPIO43<br />
  miso_pin: GPIO44<br />
  cs_pin: GPIO41<br />
  interrupt_pin: GPIO2<br />
  reset_pin: GPIO1<br />
<br />
i2c:<br />
 &nbsp;&nbsp;- id: bus_a<br />
   &nbsp;&nbsp;sda: 8<br />
   &nbsp;&nbsp;scl: 18<br />
   &nbsp;&nbsp;scan: true<br />
   &nbsp;&nbsp;frequency: 400kHz<br />
<br />
pcf8574:<br />
  - id: 'pcf8574_hub_in_1'  # for DI1-DI4 Relay1-Relay4<br />
    i2c_id: bus_a<br />
    address: 0x24<br />
    pcf8575: true<br />
<br />
uart:<br />
  - id: uart_1    #RS485<br />
    baud_rate: 9600<br />
    debug:<br />
      direction: BOTH<br />
      dummy_receiver: true<br />
      after:<br />
        timeout: 10ms<br />
    tx_pin: 16<br />
    rx_pin: 17<br />
<br />
  - id: tuya_mcu_uart<br />
    tx_pin: GPIO39<br />
    rx_pin: GPIO38<br />
    baud_rate: 9600<br />
<br />
tuya_wifi_mcu:<br />
  # tuya mcu product id<br />
  product_id: gk6ok3aysk6lw1bb<br />
  uart_id: tuya_mcu_uart<br />
  wifi_reset_pin: 28<br />
  wifi_led_pin: 16<br />
<br />
switch:<br />
  - platform: uart<br />
    uart_id: uart_1<br />
    name: "RS485 Button"<br />
    data: [0x11, 0x22, 0x33, 0x44, 0x55]<br />
<br />
  - platform: gpio<br />
    name: "f8-output01"<br />
    id: "f8_output01"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 8<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output1-tuya<br />
    dp_id: 1<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output01"<br />
<br />
  - platform: gpio<br />
    name: "f8-output02"<br />
    id: "f8_output02"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 9<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output2-tuya<br />
    dp_id: 2<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output02"<br />
<br />
  - platform: gpio<br />
    name: "f8-output03"<br />
    id: "f8_output03"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 10<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output3-tuya<br />
    dp_id: 3<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output03"<br />
<br />
  - platform: gpio<br />
    name: "f8-output04"<br />
    id: "f8_output04"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 11<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output4-tuya<br />
    dp_id: 4<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output04"<br />
<br />
  - platform: gpio<br />
    name: "f8-output05"<br />
    id: "f8_output05"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 12<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output5-tuya<br />
    dp_id: 5<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output05"<br />
<br />
  - platform: gpio<br />
    name: "f8-output06"<br />
    id: "f8_output06"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 13<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output6-tuya<br />
    dp_id: 6<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output06"<br />
<br />
  - platform: gpio<br />
    name: "f8-output07"<br />
    id: "f8_output07"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 14<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output4-tuya<br />
    dp_id: 101<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output07"<br />
<br />
  - platform: gpio<br />
    name: "f8-output08"<br />
    id: "f8_output08"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 15<br />
      mode: OUTPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-output8-tuya<br />
    dp_id: 102<br />
    # hide from homeassistant ui<br />
    internal: true<br />
    # bind other switch, sync state<br />
    bind_switch_id: "f8_output08"<br />
<br />
binary_sensor:<br />
  - platform: gpio<br />
    name: "f8-input01"<br />
    id: "f8_input01"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 0<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input1-tuya<br />
    dp_id: 111<br />
    bind_binary_sensor_id: f8_input01<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input02"<br />
    id: "f8_input02"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 1<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input2-tuya<br />
    dp_id: 112<br />
    bind_binary_sensor_id: f8_input02<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input03"<br />
    id: "f8_input03"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 2<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input3-tuya<br />
    dp_id: 113<br />
    bind_binary_sensor_id: f8_input03<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input04"<br />
    id: "f8_input04"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 3<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input4-tuya<br />
    dp_id: 114<br />
    bind_binary_sensor_id: f8_input04<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input05"<br />
    id: "f8_input05"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 4<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input5-tuya<br />
    dp_id: 115<br />
    bind_binary_sensor_id: f8_input05<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input06"<br />
    id: "f8_input06"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 5<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input6-tuya<br />
    dp_id: 116<br />
    bind_binary_sensor_id: f8_input06<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input07"<br />
    id: "f8_input07"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 6<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input7-tuya<br />
    dp_id: 117<br />
    bind_binary_sensor_id: f8_input07<br />
    internal: true<br />
<br />
  - platform: gpio<br />
    name: "f8-input08"<br />
    id: "f8_input08"<br />
    pin:<br />
      pcf8574: pcf8574_hub_in_1<br />
      number: 7<br />
      mode: INPUT<br />
      inverted: true<br />
  - platform: tuya_wifi_mcu<br />
    name: f8-input8-tuya<br />
    dp_id: 118<br />
    bind_binary_sensor_id: f8_input08<br />
    internal: true<br />
<br />
##pull-up resistance on PCB<br />
  - platform: gpio<br />
    name: "f8-W1-io48"<br />
    pin: <br />
      number: 48<br />
      inverted: true<br />
<br />
  - platform: gpio<br />
    name: "f8-W1-io47"<br />
    pin: <br />
      number: 47<br />
      inverted: true<br />
<br />
  - platform: gpio<br />
    name: "f8-W1-io21"<br />
    pin: <br />
      number: 21<br />
      inverted: true<br />
<br />
  - platform: gpio<br />
    name: "f8-W1-io15"<br />
    pin: <br />
      number: 15<br />
      inverted: true<br />
## without resistance on PCB<br />
  - platform: gpio<br />
    name: "f8-W1-io14"<br />
    pin: <br />
      number: 14<br />
      inverted:  false<br />
<br />
  - platform: gpio<br />
    name: "f8-433M"<br />
    pin: <br />
      number: 40<br />
      inverted:  false<br />
<br />
  - platform: gpio<br />
    name: "f8-io0"<br />
    pin: <br />
      number: 0<br />
      inverted:  false<br />
<br />
sensor:<br />
  - platform: adc<br />
    pin: 5<br />
    name: "f8 A1 Voltage"<br />
    update_interval: 5s<br />
    attenuation: 11db<br />
    filters:<br />
      - lambda:<br />
          if (x &gt;= 3.11) {<br />
            return x * 1.60256;<br />
          } else if (x &lt;= 0.15) {<br />
            return 0;<br />
          } else {<br />
            return x * 1.51;<br />
          }<br />
  - platform: adc<br />
    pin: 7<br />
    name: "f8 A2 Voltage"<br />
    update_interval: 5s<br />
    attenuation: 11db<br />
    filters:<br />
      # - multiply: 1.51515<br />
      - lambda:<br />
          if (x &gt;= 3.11) {<br />
            return x * 1.60256;<br />
          } else if (x &lt;= 0.15) {<br />
            return 0;<br />
          } else {<br />
            return x * 1.51;<br />
          }<br />
  - platform: adc<br />
    pin: 6<br />
    name: "f8 A3 Current"<br />
    update_interval: 5s<br />
    unit_of_measurement: mA<br />
    attenuation: 11db<br />
    filters:<br />
      - multiply: 6.66666666<br />
  - platform: adc<br />
    pin: 4<br />
    name: "f8 A4 Current"<br />
    update_interval: 5s<br />
    unit_of_measurement: mA<br />
    attenuation: 11db<br />
    filters:<br />
      - multiply: 6.66666666<br />
<br />
web_server:<br />
  port: 80<br />
<br />
font:<br />
  - file: "gfonts://Roboto"<br />
    id: roboto<br />
    size: 20<br />
<br />
display:<br />
  - platform: ssd1306_i2c<br />
    i2c_id: bus_a<br />
    model: "SSD1306 128x64"<br />
    address: 0x3C<br />
    lambda: |-<br />
      it.printf(0, 0, id(roboto), "KinCony f8");</code></div></div>esphome yaml:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/txt.png" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10301" target="_blank" title="">F8-HA-tuya.txt</a> (Size: 8.68 KB / Downloads: 127)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[KinCony F8 + ESPHome: Unable to Enter Tuya Pairing Mode (Smart Config)]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=9709</link>
			<pubDate>Sat, 01 Aug 2026 19:49:35 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=11347">gdidonato</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=9709</guid>
			<description><![CDATA[Hi!<br />
<br />
I'm trying to pair a KinCony F8 device with my Tuya account. I flashed it with an ESPHome firmware, and it is working perfectly with Home Assistant.<br />
<br />
Now I'd like to add Tuya connectivity. Based on the example code shared in this forum, I installed the firmware on my device, but I can't get it to enter pairing mode.<br />
<br />
One thing that seems unusual is that the Tuya module never appears to complete its initialization. As shown in the attached ESPHome logs, the message <span style="font-weight: bold;" class="mycode_b">"begin smart config"</span> is printed repeatedly about <span style="font-weight: bold;" class="mycode_b">every 50 ms</span>, making it look as if the module is continuously trying to enter Smart Config instead of staying in pairing mode. Could this indicate that the Tuya module is not responding correctly or that I'm missing an initialization step?<br />
<br />
I've attached the ESPHome firmware and the ESPHome logs.<br />
<br />
I would really appreciate your help identifying what I'm doing wrong and how to get it working.<br />
<br />
Thank you very much!<br />
Guillermo<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/txt.png" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10299" target="_blank" title="">test-logs.txt</a> (Size: 6.34 KB / Downloads: 158)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/txt.png" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10300" target="_blank" title="">Kincony-F8-ESPHome-Tuya.txt</a> (Size: 4.14 KB / Downloads: 102)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hi!<br />
<br />
I'm trying to pair a KinCony F8 device with my Tuya account. I flashed it with an ESPHome firmware, and it is working perfectly with Home Assistant.<br />
<br />
Now I'd like to add Tuya connectivity. Based on the example code shared in this forum, I installed the firmware on my device, but I can't get it to enter pairing mode.<br />
<br />
One thing that seems unusual is that the Tuya module never appears to complete its initialization. As shown in the attached ESPHome logs, the message <span style="font-weight: bold;" class="mycode_b">"begin smart config"</span> is printed repeatedly about <span style="font-weight: bold;" class="mycode_b">every 50 ms</span>, making it look as if the module is continuously trying to enter Smart Config instead of staying in pairing mode. Could this indicate that the Tuya module is not responding correctly or that I'm missing an initialization step?<br />
<br />
I've attached the ESPHome firmware and the ESPHome logs.<br />
<br />
I would really appreciate your help identifying what I'm doing wrong and how to get it working.<br />
<br />
Thank you very much!<br />
Guillermo<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/txt.png" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10299" target="_blank" title="">test-logs.txt</a> (Size: 6.34 KB / Downloads: 158)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/txt.png" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10300" target="_blank" title="">Kincony-F8-ESPHome-Tuya.txt</a> (Size: 4.14 KB / Downloads: 102)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[F8 Smart Controller Wiring Examples]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=9265</link>
			<pubDate>Sun, 19 Apr 2026 15:42:46 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=9265</guid>
			<description><![CDATA[<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=9647" target="_blank" title="">F8_wiring.jpg</a> (Size: 335 KB / Downloads: 382)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=9647" target="_blank" title="">F8_wiring.jpg</a> (Size: 335 KB / Downloads: 382)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[F8 Smart Controller ESP32 system block diagram]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=9264</link>
			<pubDate>Sun, 19 Apr 2026 15:41:51 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=9264</guid>
			<description><![CDATA[<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=9646" target="_blank" title="">KinCony-F8-smart-controller-diagram.png</a> (Size: 792.15 KB / Downloads: 392)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=9646" target="_blank" title="">KinCony-F8-smart-controller-diagram.png</a> (Size: 792.15 KB / Downloads: 392)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[F8 on device physical switches in ESPHome]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=9120</link>
			<pubDate>Sun, 15 Mar 2026 04:07:51 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=8693">Vinceken</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=9120</guid>
			<description><![CDATA[Hi - with esp-idf in ESPHome, how can I access the state of the physical on device switches?<br />
<br />
I can't seem to observe those on any GPIO pins.<br />
<br />
I would like to configure (in esphome) some of them to control their output relay directly, but for others for them to act as momentary switches. I can manage all the coding myself if I can work out where to observe their state...<br />
<br />
Thanks.]]></description>
			<content:encoded><![CDATA[Hi - with esp-idf in ESPHome, how can I access the state of the physical on device switches?<br />
<br />
I can't seem to observe those on any GPIO pins.<br />
<br />
I would like to configure (in esphome) some of them to control their output relay directly, but for others for them to act as momentary switches. I can manage all the coding myself if I can work out where to observe their state...<br />
<br />
Thanks.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[F8 N16R8]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=8973</link>
			<pubDate>Fri, 30 Jan 2026 20:15:03 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=7115">kulibin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=8973</guid>
			<description><![CDATA[Hi Gerarding model F8 N16R8 . There are have UART pin ?]]></description>
			<content:encoded><![CDATA[Hi Gerarding model F8 N16R8 . There are have UART pin ?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[F8 physical on device switches]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=8904</link>
			<pubDate>Mon, 12 Jan 2026 18:54:34 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=10215">asalhi</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=8904</guid>
			<description><![CDATA[Hello KinCony,<br />
<br />
I have a question about the physical switch exists on the device itself, I need to be able to change their behavior to toggle switch instead of normal switch. I mean to toggle the relay state (on -&gt; off, or off -&gt; on) once it is flipped.<br />
<br />
btw, thank your for such awesome devices.]]></description>
			<content:encoded><![CDATA[Hello KinCony,<br />
<br />
I have a question about the physical switch exists on the device itself, I need to be able to change their behavior to toggle switch instead of normal switch. I mean to toggle the relay state (on -&gt; off, or off -&gt; on) once it is flipped.<br />
<br />
btw, thank your for such awesome devices.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Delay Relay F8]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=8579</link>
			<pubDate>Wed, 24 Sep 2025 14:13:35 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=9281">abbasgts</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=8579</guid>
			<description><![CDATA[<span style="font-size: 1pt;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">Pin Definitions:</span></span><br />
<span style="font-size: medium;" class="mycode_size">Subject: Request: Sequential 8-relay example for F8 (ESP32-S3), 1.5s step, reverse on shutdown<br />
</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">Message:</span><br />
<span style="font-size: medium;" class="mycode_size">Hello KinCony team,</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">I am using the KinCony F8 (ESP32-S3) board with the PCF8575 I/O expander to control 8 relays. I would like to have an Arduino example that performs the following:</span><br />
<span style="font-size: medium;" class="mycode_size">  •  Sequential ON: Relay1 → Relay8, with 1.5 seconds delay between each relay.</span><br />
<span style="font-size: medium;" class="mycode_size">  •  Sequential OFF: Relay8 → Relay1, with the same 1.5 seconds delay.</span><br />
<span style="font-size: medium;" class="mycode_size">  •  Arduino IDE, using I2C with SDA = GPIO8, SCL = GPIO18, and PCF8575 address = 0x24 (please confirm).</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">My questions are:</span><br />
<span style="font-size: medium;" class="mycode_size">1. What is the exact GPIO mapping for each relay on the F8 hardware revision?</span><br />
<span style="font-size: medium;" class="mycode_size">2. Do you have an official Arduino example implementing this sequence?</span><br />
<span style="font-size: medium;" class="mycode_size">3. If there is a recommended library or header file for this board, could you please share the link?</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">Here is a sample code I tested so far (for reference):</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">// I2C pins</span></span><br />
<span style="font-size: 1pt;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">#define SDA 8</span></span><br />
<span style="font-size: 1pt;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">#define SCL 18</span></span><br />
#include &lt;Wire.h&gt;<br />
#include &lt;PCF8575.h&gt;<br />
<br />
#define I2C_SDA 8<br />
#define I2C_SCL 18<br />
#define PCF8575_ADDR 0x24<br />
<br />
PCF8575 pcf(PCF8575_ADDR);<br />
const uint8_t RELAY_PINS[8] = {P0, P1, P2, P3, P4, P5, P6, P7};<br />
<br />
void setup() {<br />
  Serial.begin(115200);<br />
  if (!pcf.begin(I2C_SDA, I2C_SCL)) {<br />
    Serial.println("PCF8575 not found!");<br />
    while (1);<br />
  }<br />
  for (int i = 0; i &lt; 8; i++) {<br />
    pcf.write(RELAY_PINS[i], HIGH);  // OFF at start<br />
  }<br />
}<br />
<br />
void loop() {<br />
  // Sequential ON<br />
  for (int i = 0; i &lt; 8; i++) {<br />
    Serial.print("Relay ON: "); Serial.println(i+1);<br />
    pcf.write(RELAY_PINS[i], LOW);<br />
    delay(1500);<br />
  }<br />
<br />
  // Sequential OFF<br />
  for (int i = 7; i &gt;= 0; i--) {<br />
    Serial.print("Relay OFF: "); Serial.println(i+1);<br />
    pcf.write(RELAY_PINS[i], HIGH);<br />
    delay(1500);<br />
  }<br />
}]]></description>
			<content:encoded><![CDATA[<span style="font-size: 1pt;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">Pin Definitions:</span></span><br />
<span style="font-size: medium;" class="mycode_size">Subject: Request: Sequential 8-relay example for F8 (ESP32-S3), 1.5s step, reverse on shutdown<br />
</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">Message:</span><br />
<span style="font-size: medium;" class="mycode_size">Hello KinCony team,</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">I am using the KinCony F8 (ESP32-S3) board with the PCF8575 I/O expander to control 8 relays. I would like to have an Arduino example that performs the following:</span><br />
<span style="font-size: medium;" class="mycode_size">  •  Sequential ON: Relay1 → Relay8, with 1.5 seconds delay between each relay.</span><br />
<span style="font-size: medium;" class="mycode_size">  •  Sequential OFF: Relay8 → Relay1, with the same 1.5 seconds delay.</span><br />
<span style="font-size: medium;" class="mycode_size">  •  Arduino IDE, using I2C with SDA = GPIO8, SCL = GPIO18, and PCF8575 address = 0x24 (please confirm).</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">My questions are:</span><br />
<span style="font-size: medium;" class="mycode_size">1. What is the exact GPIO mapping for each relay on the F8 hardware revision?</span><br />
<span style="font-size: medium;" class="mycode_size">2. Do you have an official Arduino example implementing this sequence?</span><br />
<span style="font-size: medium;" class="mycode_size">3. If there is a recommended library or header file for this board, could you please share the link?</span><br />
<br />
<span style="font-size: medium;" class="mycode_size">Here is a sample code I tested so far (for reference):</span><br />
<span style="font-size: medium;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">// I2C pins</span></span><br />
<span style="font-size: 1pt;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">#define SDA 8</span></span><br />
<span style="font-size: 1pt;" class="mycode_size"><span style="font-family: Monaco, Consolas, Courier, monospace;" class="mycode_font">#define SCL 18</span></span><br />
#include &lt;Wire.h&gt;<br />
#include &lt;PCF8575.h&gt;<br />
<br />
#define I2C_SDA 8<br />
#define I2C_SCL 18<br />
#define PCF8575_ADDR 0x24<br />
<br />
PCF8575 pcf(PCF8575_ADDR);<br />
const uint8_t RELAY_PINS[8] = {P0, P1, P2, P3, P4, P5, P6, P7};<br />
<br />
void setup() {<br />
  Serial.begin(115200);<br />
  if (!pcf.begin(I2C_SDA, I2C_SCL)) {<br />
    Serial.println("PCF8575 not found!");<br />
    while (1);<br />
  }<br />
  for (int i = 0; i &lt; 8; i++) {<br />
    pcf.write(RELAY_PINS[i], HIGH);  // OFF at start<br />
  }<br />
}<br />
<br />
void loop() {<br />
  // Sequential ON<br />
  for (int i = 0; i &lt; 8; i++) {<br />
    Serial.print("Relay ON: "); Serial.println(i+1);<br />
    pcf.write(RELAY_PINS[i], LOW);<br />
    delay(1500);<br />
  }<br />
<br />
  // Sequential OFF<br />
  for (int i = 7; i &gt;= 0; i--) {<br />
    Serial.print("Relay OFF: "); Serial.println(i+1);<br />
    pcf.write(RELAY_PINS[i], HIGH);<br />
    delay(1500);<br />
  }<br />
}]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-11 Digital input trigger relay output]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7995</link>
			<pubDate>Sun, 20 Apr 2025 15:28:23 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7995</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * This program reads 8 input states from a PCF8575 I/O expander and <br />
 * controls a corresponding 8-channel relay module. When an input pin <br />
 * is LOW, the corresponding relay is turned ON (LOW means ON for the relay).<br />
 *<br />
 * Pin Definitions:<br />
 * - SDA: GPIO 8<br />
 * - SCL: GPIO 18<br />
 * - PCF8575 I2C Address: 0x24<br />
 */<br />
<br />
#include &lt;Wire.h&gt;<br />
#include &lt;PCF8575.h&gt;<br />
<br />
// I2C pins<br />
#define SDA 8<br />
#define SCL 18<br />
<br />
// PCF8575 I2C address<br />
#define INPUT_I2C_ADDRESS 0x24 &nbsp;&nbsp;<br />
<br />
// Create PCF8575 object<br />
PCF8575 pcf8575_IN(INPUT_I2C_ADDRESS);<br />
<br />
void setup() {<br />
  // Initialize I2C communication<br />
  Wire.begin(SDA, SCL);<br />
<br />
  // Initialize serial communication<br />
  Serial.begin(115200);<br />
  <br />
  // Initialize PCF8575<br />
  pcf8575_IN.begin();<br />
<br />
  // Turn off all relays first (assuming LOW activates the relay)<br />
  for (int i = 8; i &lt; 16; i++) {<br />
    pcf8575_IN.write(i, HIGH);  // Set to HIGH to turn off the relay<br />
  }<br />
<br />
  Serial.println("System started: Input state controlling 8 relays");<br />
}<br />
<br />
void loop() {<br />
  // Read 16-bit state from PCF8575<br />
  uint16_t inputState = pcf8575_IN.read16(); <br />
<br />
  for (int i = 0; i &lt; 8; i++) {<br />
    bool state = bitRead(inputState, i); // Read digital input state<br />
<br />
    Serial.print("DI");<br />
    Serial.print(i + 1);<br />
    Serial.print(" State: ");<br />
    Serial.println(state ? "HIGH" : "LOW");<br />
<br />
    // Control relay (LOW activates the relay)<br />
    pcf8575_IN.write(8 + i, state ? HIGH : LOW);<br />
  }<br />
<br />
  Serial.println("---------------------");<br />
  delay(500);<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7521" target="_blank" title="">11-input-trigger-output.zip</a> (Size: 898 bytes / Downloads: 727)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7522" target="_blank" title="">11-input-trigger-output.ino.merged.zip</a> (Size: 189.63 KB / Downloads: 690)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * This program reads 8 input states from a PCF8575 I/O expander and <br />
 * controls a corresponding 8-channel relay module. When an input pin <br />
 * is LOW, the corresponding relay is turned ON (LOW means ON for the relay).<br />
 *<br />
 * Pin Definitions:<br />
 * - SDA: GPIO 8<br />
 * - SCL: GPIO 18<br />
 * - PCF8575 I2C Address: 0x24<br />
 */<br />
<br />
#include &lt;Wire.h&gt;<br />
#include &lt;PCF8575.h&gt;<br />
<br />
// I2C pins<br />
#define SDA 8<br />
#define SCL 18<br />
<br />
// PCF8575 I2C address<br />
#define INPUT_I2C_ADDRESS 0x24 &nbsp;&nbsp;<br />
<br />
// Create PCF8575 object<br />
PCF8575 pcf8575_IN(INPUT_I2C_ADDRESS);<br />
<br />
void setup() {<br />
  // Initialize I2C communication<br />
  Wire.begin(SDA, SCL);<br />
<br />
  // Initialize serial communication<br />
  Serial.begin(115200);<br />
  <br />
  // Initialize PCF8575<br />
  pcf8575_IN.begin();<br />
<br />
  // Turn off all relays first (assuming LOW activates the relay)<br />
  for (int i = 8; i &lt; 16; i++) {<br />
    pcf8575_IN.write(i, HIGH);  // Set to HIGH to turn off the relay<br />
  }<br />
<br />
  Serial.println("System started: Input state controlling 8 relays");<br />
}<br />
<br />
void loop() {<br />
  // Read 16-bit state from PCF8575<br />
  uint16_t inputState = pcf8575_IN.read16(); <br />
<br />
  for (int i = 0; i &lt; 8; i++) {<br />
    bool state = bitRead(inputState, i); // Read digital input state<br />
<br />
    Serial.print("DI");<br />
    Serial.print(i + 1);<br />
    Serial.print(" State: ");<br />
    Serial.println(state ? "HIGH" : "LOW");<br />
<br />
    // Control relay (LOW activates the relay)<br />
    pcf8575_IN.write(8 + i, state ? HIGH : LOW);<br />
  }<br />
<br />
  Serial.println("---------------------");<br />
  delay(500);<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7521" target="_blank" title="">11-input-trigger-output.zip</a> (Size: 898 bytes / Downloads: 727)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7522" target="_blank" title="">11-input-trigger-output.ino.merged.zip</a> (Size: 189.63 KB / Downloads: 690)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-10 Print TEXT on SSD1306 OLED displayer]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7994</link>
			<pubDate>Sun, 20 Apr 2025 15:21:27 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7994</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 * <br />
 * This Arduino program demonstrates how to display text on an SSD1306 128x64 OLED display using the U8g2 library.<br />
 * The program draws two lines of text on the display:<br />
 * - The first line is "KINCONY" in a larger font.<br />
 * - The second line is "www.kincony.com" in a smaller font.<br />
 * <br />
 * The display is connected via I2C (software implementation) with:<br />
 * - SCL (clock) on pin IO18<br />
 * - SDA (data) on pin IO8<br />
 * <br />
 * The display's I2C address is set to 0x3C.<br />
 */<br />
<br />
#include &lt;U8g2lib.h&gt;  // Include the U8g2 library for controlling the OLED display<br />
#include &lt;Wire.h&gt;   &nbsp;&nbsp;// Include the Wire library for I2C communication<br />
<br />
// Initialize the display using the software I2C method (SCL = IO18, SDA = IO8)<br />
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,  18, 8, U8X8_PIN_NONE);  // Screen rotation: U8G2_R0<br />
<br />
// Function to display page 1 content<br />
void page1() {<br />
  // Set font size 18 for the larger "KINCONY" text<br />
  u8g2.setFont(u8g2_font_timR18_tf);  // Use the Times Roman font, size 18<br />
  u8g2.setFontPosTop();             &nbsp;&nbsp;// Set the text position at the top of the display<br />
  u8g2.setCursor(5, 0);             &nbsp;&nbsp;// Position the cursor at coordinates (5, 0)<br />
  u8g2.print("KINCONY");              // Display the text "KINCONY" on the screen<br />
<br />
  // Set font size 12 for the smaller "www.kincony.com" text<br />
  u8g2.setFont(u8g2_font_timR12_tf);  // Use the Times Roman font, size 12<br />
  u8g2.setCursor(0, 40);              // Position the cursor at coordinates (0, 40)<br />
  u8g2.print("www.kincony.com");      // Display the text "www.kincony.com"<br />
}<br />
<br />
// Setup function, runs once when the program starts<br />
void setup() {<br />
  // Set the I2C address for the display to 0x3C<br />
  u8g2.setI2CAddress(0x3C*2);  // I2C address shift for 8-bit format<br />
  <br />
  // Initialize the display<br />
  u8g2.begin();<br />
  <br />
  // Enable UTF-8 character printing for the display<br />
  u8g2.enableUTF8Print();  // Allow UTF-8 encoded text to be printed<br />
}<br />
<br />
// Main loop function, continuously runs after setup()<br />
void loop() {<br />
  // Begin the display drawing process<br />
  u8g2.firstPage();  // Prepare the first page for drawing<br />
  do {<br />
    // Call the page1() function to draw content on the display<br />
    page1();<br />
  } while (u8g2.nextPage());  // Continue to the next page until all pages are drawn<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7519" target="_blank" title="">10-oled-ssd1306.zip</a> (Size: 1.11 KB / Downloads: 682)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7520" target="_blank" title="">10-oled-ssd1306.ino.merged.zip</a> (Size: 201.24 KB / Downloads: 687)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 * <br />
 * This Arduino program demonstrates how to display text on an SSD1306 128x64 OLED display using the U8g2 library.<br />
 * The program draws two lines of text on the display:<br />
 * - The first line is "KINCONY" in a larger font.<br />
 * - The second line is "www.kincony.com" in a smaller font.<br />
 * <br />
 * The display is connected via I2C (software implementation) with:<br />
 * - SCL (clock) on pin IO18<br />
 * - SDA (data) on pin IO8<br />
 * <br />
 * The display's I2C address is set to 0x3C.<br />
 */<br />
<br />
#include &lt;U8g2lib.h&gt;  // Include the U8g2 library for controlling the OLED display<br />
#include &lt;Wire.h&gt;   &nbsp;&nbsp;// Include the Wire library for I2C communication<br />
<br />
// Initialize the display using the software I2C method (SCL = IO18, SDA = IO8)<br />
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,  18, 8, U8X8_PIN_NONE);  // Screen rotation: U8G2_R0<br />
<br />
// Function to display page 1 content<br />
void page1() {<br />
  // Set font size 18 for the larger "KINCONY" text<br />
  u8g2.setFont(u8g2_font_timR18_tf);  // Use the Times Roman font, size 18<br />
  u8g2.setFontPosTop();             &nbsp;&nbsp;// Set the text position at the top of the display<br />
  u8g2.setCursor(5, 0);             &nbsp;&nbsp;// Position the cursor at coordinates (5, 0)<br />
  u8g2.print("KINCONY");              // Display the text "KINCONY" on the screen<br />
<br />
  // Set font size 12 for the smaller "www.kincony.com" text<br />
  u8g2.setFont(u8g2_font_timR12_tf);  // Use the Times Roman font, size 12<br />
  u8g2.setCursor(0, 40);              // Position the cursor at coordinates (0, 40)<br />
  u8g2.print("www.kincony.com");      // Display the text "www.kincony.com"<br />
}<br />
<br />
// Setup function, runs once when the program starts<br />
void setup() {<br />
  // Set the I2C address for the display to 0x3C<br />
  u8g2.setI2CAddress(0x3C*2);  // I2C address shift for 8-bit format<br />
  <br />
  // Initialize the display<br />
  u8g2.begin();<br />
  <br />
  // Enable UTF-8 character printing for the display<br />
  u8g2.enableUTF8Print();  // Allow UTF-8 encoded text to be printed<br />
}<br />
<br />
// Main loop function, continuously runs after setup()<br />
void loop() {<br />
  // Begin the display drawing process<br />
  u8g2.firstPage();  // Prepare the first page for drawing<br />
  do {<br />
    // Call the page1() function to draw content on the display<br />
    page1();<br />
  } while (u8g2.nextPage());  // Continue to the next page until all pages are drawn<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7519" target="_blank" title="">10-oled-ssd1306.zip</a> (Size: 1.11 KB / Downloads: 682)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7520" target="_blank" title="">10-oled-ssd1306.ino.merged.zip</a> (Size: 201.24 KB / Downloads: 687)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-09 how to communication with Tuya WiFi module]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7993</link>
			<pubDate>Sun, 20 Apr 2025 15:19:19 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7993</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 * <br />
 * This Arduino program implements communication between ESP32 and the Tuya module<br />
 * via UART (serial communication). It listens for specific packets from the Tuya module<br />
 * and responds according to the predefined commands.<br />
 * <br />
 * Functionality:<br />
 * 1. When the ESP32 receives a heartbeat packet (55 AA 00 00 00 00 FF),<br />
 *    it sends a heartbeat response (55 AA 03 00 00 01 00 03).<br />
 * 2. When the ESP32 receives a product information request (55 AA 00 01 00 00 00),<br />
 *    it sends a product information response (55 AA 03 01 ...).<br />
 * 3. When the ESP32 receives a work mode request (55 AA 00 02 00 00 01),<br />
 *    it sends a work mode response (55 AA 03 02 00 03 10 1C 14 47).<br />
 * 4. When the ESP32 receives a network status request (55 AA 00 03 00 01 00 03),<br />
 *    it sends a network status response (55 AA 03 03 00 00 05).<br />
 * 5. Subsequent heartbeat packets (55 AA 00 00 00 00 FF) are responded to with<br />
 *    (55 AA 03 00 00 01 01 04).<br />
 */<br />
<br />
#include &lt;HardwareSerial.h&gt;<br />
<br />
// Create a HardwareSerial object for UART communication on ESP32<br />
HardwareSerial tuyaSerial(1);<br />
<br />
// Define the GPIO pins for TXD and RXD used for serial communication<br />
#define TXD_PIN 39<br />
#define RXD_PIN 38<br />
<br />
// Set the baud rate for Tuya module communication to 9600<br />
#define BAUD_RATE 9600<br />
<br />
// Define the response packets for different commands from the Tuya module<br />
<br />
// Heartbeat response: 55 AA 03 00 00 01 00 03<br />
uint8_t heartBeatResponse[] = {0x55, 0xAA, 0x03, 0x00, 0x00, 0x01, 0x00, 0x03};<br />
<br />
// Product info response with a detailed payload (e.g., firmware version, product name, etc.)<br />
uint8_t productInfoResponse[] = {<br />
  0x55, 0xAA, 0x03, 0x01, 0x00, 0x2A, 0x7B, 0x22, 0x70, 0x22, 0x3A, 0x22, <br />
  0x63, 0x68, 0x6D, 0x7A, 0x6C, 0x67, 0x6A, 0x70, 0x61, 0x64, 0x70, 0x71, <br />
  0x78, 0x64, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x76, 0x22, 0x3A, 0x22, 0x31, <br />
  0x2E, 0x30, 0x2E, 0x30, 0x22, 0x2C, 0x22, 0x6D, 0x22, 0x3A, 0x30, 0x7D, 0xAA<br />
};<br />
<br />
// Work mode response: 55 AA 03 02 00 03 10 1C 14 47<br />
uint8_t workModeResponse[] = {0x55, 0xAA, 0x03, 0x02, 0x00, 0x03, 0x10, 0x1C, 0x14, 0x47};<br />
<br />
// Network status response: 55 AA 03 03 00 00 05<br />
uint8_t netStatusResponse[] = {0x55, 0xAA, 0x03, 0x03, 0x00, 0x00, 0x05};<br />
<br />
// Subsequent heartbeat response: 55 AA 03 00 00 01 01 04<br />
uint8_t secondHeartBeatResponse[] = {0x55, 0xAA, 0x03, 0x00, 0x00, 0x01, 0x01, 0x04};<br />
<br />
void setup() {<br />
  // Initialize the serial communication for debugging at 115200 baud rate<br />
  Serial.begin(115200);<br />
<br />
  // Initialize the serial communication with Tuya module at 9600 baud rate<br />
  tuyaSerial.begin(BAUD_RATE, SERIAL_8N1, RXD_PIN, TXD_PIN);<br />
<br />
  // Debug message to indicate that the serial communication has been initialized<br />
  Serial.println("ESP32-Tuya serial communication initialized.");<br />
}<br />
<br />
void loop() {<br />
  // Check if data is available from the Tuya module<br />
  if (tuyaSerial.available()) {<br />
    uint8_t incomingPacket[7];  // Array to store the received packet<br />
    size_t bytesRead = tuyaSerial.readBytes(incomingPacket, 7); // Read 7 bytes from Tuya<br />
<br />
    // Check if the packet has a valid header (0x55, 0xAA)<br />
    if (bytesRead &gt;= 2 &amp;&amp; incomingPacket[0] == 0x55 &amp;&amp; incomingPacket[1] == 0xAA) {<br />
      // If less than 7 bytes were received, wait for more data<br />
      if (bytesRead &lt; 7) {<br />
        Serial.println("Incomplete packet received. Waiting for remaining bytes...");<br />
        delay(50); // Delay to allow more data to be received<br />
        while (tuyaSerial.available()) {<br />
          incomingPacket[bytesRead++] = tuyaSerial.read(); // Continue reading remaining bytes<br />
          if (bytesRead &gt;= 7) break;<br />
        }<br />
      }<br />
<br />
      // If still less than 7 bytes, discard the incomplete packet<br />
      if (bytesRead &lt; 7) {<br />
        Serial.println("Error: Incomplete packet discarded.");<br />
        return;<br />
      }<br />
<br />
      // Debug: Print the received packet for logging<br />
      Serial.print("Received packet: ");<br />
      for (size_t i = 0; i &lt; 7; i++) {<br />
        Serial.print(incomingPacket[i], HEX);<br />
        Serial.print(" ");<br />
      }<br />
      Serial.println();<br />
<br />
      // Call the function to process the received packet<br />
      processTuyaPacket(incomingPacket, 7);<br />
<br />
    } else {<br />
      // If the header is invalid, discard the packet and flush the buffer<br />
      Serial.print("Error: Invalid packet header. Data received: ");<br />
      for (size_t i = 0; i &lt; bytesRead; i++) {<br />
        Serial.print(incomingPacket[i], HEX);<br />
        Serial.print(" ");<br />
      }<br />
      Serial.println();<br />
      tuyaSerial.flush(); // Clear the serial buffer<br />
    }<br />
  }<br />
<br />
  // Delay to avoid CPU overuse<br />
  delay(100);<br />
}<br />
<br />
// Function to process the received packet and send the appropriate response<br />
void processTuyaPacket(uint8_t* packet, size_t size) {<br />
  // Ensure the packet size is 7 and the header is valid<br />
  if (size == 7 &amp;&amp; packet[0] == 0x55 &amp;&amp; packet[1] == 0xAA) {<br />
    // Determine the command in the packet (packet[2])<br />
    switch(packet[2]) {<br />
      case 0x00:<br />
        if (packet[3] == 0x00 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x00 &amp;&amp; packet[6] == 0xFF) {<br />
          Serial.println("Heartbeat received.");<br />
          sendPacket(heartBeatResponse, sizeof(heartBeatResponse));<br />
        } else if (packet[3] == 0x01 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x00 &amp;&amp; packet[6] == 0x00) {<br />
          Serial.println("Product info request received.");<br />
          sendPacket(productInfoResponse, sizeof(productInfoResponse));<br />
        } else if (packet[3] == 0x02 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x00 &amp;&amp; packet[6] == 0x01) {<br />
          Serial.println("Work mode request received.");<br />
          sendPacket(workModeResponse, sizeof(workModeResponse));<br />
        } else if (packet[3] == 0x03 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x01 &amp;&amp; packet[6] == 0x00) {<br />
          Serial.println("Network status request received.");<br />
          sendPacket(netStatusResponse, sizeof(netStatusResponse));<br />
        }<br />
        break;<br />
<br />
      default:<br />
        Serial.println("Error: Unhandled command received.");<br />
        break;<br />
    }<br />
  }<br />
}<br />
<br />
// Function to send the response packet to the Tuya module<br />
void sendPacket(uint8_t* packet, size_t size) {<br />
  // Send the packet via UART to Tuya module<br />
  tuyaSerial.write(packet, size);<br />
<br />
  // Debug: Print the sent packet for logging<br />
  Serial.print("Sent packet: ");<br />
  for (size_t i = 0; i &lt; size; i++) {<br />
    Serial.print(packet[i], HEX);<br />
    Serial.print(" ");<br />
  }<br />
  Serial.println();<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7517" target="_blank" title="">9-tuya-wifi-config.zip</a> (Size: 2 KB / Downloads: 745)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7518" target="_blank" title="">9-tuya-wifi-config.ino.merged.zip</a> (Size: 184.92 KB / Downloads: 761)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 * <br />
 * This Arduino program implements communication between ESP32 and the Tuya module<br />
 * via UART (serial communication). It listens for specific packets from the Tuya module<br />
 * and responds according to the predefined commands.<br />
 * <br />
 * Functionality:<br />
 * 1. When the ESP32 receives a heartbeat packet (55 AA 00 00 00 00 FF),<br />
 *    it sends a heartbeat response (55 AA 03 00 00 01 00 03).<br />
 * 2. When the ESP32 receives a product information request (55 AA 00 01 00 00 00),<br />
 *    it sends a product information response (55 AA 03 01 ...).<br />
 * 3. When the ESP32 receives a work mode request (55 AA 00 02 00 00 01),<br />
 *    it sends a work mode response (55 AA 03 02 00 03 10 1C 14 47).<br />
 * 4. When the ESP32 receives a network status request (55 AA 00 03 00 01 00 03),<br />
 *    it sends a network status response (55 AA 03 03 00 00 05).<br />
 * 5. Subsequent heartbeat packets (55 AA 00 00 00 00 FF) are responded to with<br />
 *    (55 AA 03 00 00 01 01 04).<br />
 */<br />
<br />
#include &lt;HardwareSerial.h&gt;<br />
<br />
// Create a HardwareSerial object for UART communication on ESP32<br />
HardwareSerial tuyaSerial(1);<br />
<br />
// Define the GPIO pins for TXD and RXD used for serial communication<br />
#define TXD_PIN 39<br />
#define RXD_PIN 38<br />
<br />
// Set the baud rate for Tuya module communication to 9600<br />
#define BAUD_RATE 9600<br />
<br />
// Define the response packets for different commands from the Tuya module<br />
<br />
// Heartbeat response: 55 AA 03 00 00 01 00 03<br />
uint8_t heartBeatResponse[] = {0x55, 0xAA, 0x03, 0x00, 0x00, 0x01, 0x00, 0x03};<br />
<br />
// Product info response with a detailed payload (e.g., firmware version, product name, etc.)<br />
uint8_t productInfoResponse[] = {<br />
  0x55, 0xAA, 0x03, 0x01, 0x00, 0x2A, 0x7B, 0x22, 0x70, 0x22, 0x3A, 0x22, <br />
  0x63, 0x68, 0x6D, 0x7A, 0x6C, 0x67, 0x6A, 0x70, 0x61, 0x64, 0x70, 0x71, <br />
  0x78, 0x64, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x76, 0x22, 0x3A, 0x22, 0x31, <br />
  0x2E, 0x30, 0x2E, 0x30, 0x22, 0x2C, 0x22, 0x6D, 0x22, 0x3A, 0x30, 0x7D, 0xAA<br />
};<br />
<br />
// Work mode response: 55 AA 03 02 00 03 10 1C 14 47<br />
uint8_t workModeResponse[] = {0x55, 0xAA, 0x03, 0x02, 0x00, 0x03, 0x10, 0x1C, 0x14, 0x47};<br />
<br />
// Network status response: 55 AA 03 03 00 00 05<br />
uint8_t netStatusResponse[] = {0x55, 0xAA, 0x03, 0x03, 0x00, 0x00, 0x05};<br />
<br />
// Subsequent heartbeat response: 55 AA 03 00 00 01 01 04<br />
uint8_t secondHeartBeatResponse[] = {0x55, 0xAA, 0x03, 0x00, 0x00, 0x01, 0x01, 0x04};<br />
<br />
void setup() {<br />
  // Initialize the serial communication for debugging at 115200 baud rate<br />
  Serial.begin(115200);<br />
<br />
  // Initialize the serial communication with Tuya module at 9600 baud rate<br />
  tuyaSerial.begin(BAUD_RATE, SERIAL_8N1, RXD_PIN, TXD_PIN);<br />
<br />
  // Debug message to indicate that the serial communication has been initialized<br />
  Serial.println("ESP32-Tuya serial communication initialized.");<br />
}<br />
<br />
void loop() {<br />
  // Check if data is available from the Tuya module<br />
  if (tuyaSerial.available()) {<br />
    uint8_t incomingPacket[7];  // Array to store the received packet<br />
    size_t bytesRead = tuyaSerial.readBytes(incomingPacket, 7); // Read 7 bytes from Tuya<br />
<br />
    // Check if the packet has a valid header (0x55, 0xAA)<br />
    if (bytesRead &gt;= 2 &amp;&amp; incomingPacket[0] == 0x55 &amp;&amp; incomingPacket[1] == 0xAA) {<br />
      // If less than 7 bytes were received, wait for more data<br />
      if (bytesRead &lt; 7) {<br />
        Serial.println("Incomplete packet received. Waiting for remaining bytes...");<br />
        delay(50); // Delay to allow more data to be received<br />
        while (tuyaSerial.available()) {<br />
          incomingPacket[bytesRead++] = tuyaSerial.read(); // Continue reading remaining bytes<br />
          if (bytesRead &gt;= 7) break;<br />
        }<br />
      }<br />
<br />
      // If still less than 7 bytes, discard the incomplete packet<br />
      if (bytesRead &lt; 7) {<br />
        Serial.println("Error: Incomplete packet discarded.");<br />
        return;<br />
      }<br />
<br />
      // Debug: Print the received packet for logging<br />
      Serial.print("Received packet: ");<br />
      for (size_t i = 0; i &lt; 7; i++) {<br />
        Serial.print(incomingPacket[i], HEX);<br />
        Serial.print(" ");<br />
      }<br />
      Serial.println();<br />
<br />
      // Call the function to process the received packet<br />
      processTuyaPacket(incomingPacket, 7);<br />
<br />
    } else {<br />
      // If the header is invalid, discard the packet and flush the buffer<br />
      Serial.print("Error: Invalid packet header. Data received: ");<br />
      for (size_t i = 0; i &lt; bytesRead; i++) {<br />
        Serial.print(incomingPacket[i], HEX);<br />
        Serial.print(" ");<br />
      }<br />
      Serial.println();<br />
      tuyaSerial.flush(); // Clear the serial buffer<br />
    }<br />
  }<br />
<br />
  // Delay to avoid CPU overuse<br />
  delay(100);<br />
}<br />
<br />
// Function to process the received packet and send the appropriate response<br />
void processTuyaPacket(uint8_t* packet, size_t size) {<br />
  // Ensure the packet size is 7 and the header is valid<br />
  if (size == 7 &amp;&amp; packet[0] == 0x55 &amp;&amp; packet[1] == 0xAA) {<br />
    // Determine the command in the packet (packet[2])<br />
    switch(packet[2]) {<br />
      case 0x00:<br />
        if (packet[3] == 0x00 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x00 &amp;&amp; packet[6] == 0xFF) {<br />
          Serial.println("Heartbeat received.");<br />
          sendPacket(heartBeatResponse, sizeof(heartBeatResponse));<br />
        } else if (packet[3] == 0x01 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x00 &amp;&amp; packet[6] == 0x00) {<br />
          Serial.println("Product info request received.");<br />
          sendPacket(productInfoResponse, sizeof(productInfoResponse));<br />
        } else if (packet[3] == 0x02 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x00 &amp;&amp; packet[6] == 0x01) {<br />
          Serial.println("Work mode request received.");<br />
          sendPacket(workModeResponse, sizeof(workModeResponse));<br />
        } else if (packet[3] == 0x03 &amp;&amp; packet[4] == 0x00 &amp;&amp; packet[5] == 0x01 &amp;&amp; packet[6] == 0x00) {<br />
          Serial.println("Network status request received.");<br />
          sendPacket(netStatusResponse, sizeof(netStatusResponse));<br />
        }<br />
        break;<br />
<br />
      default:<br />
        Serial.println("Error: Unhandled command received.");<br />
        break;<br />
    }<br />
  }<br />
}<br />
<br />
// Function to send the response packet to the Tuya module<br />
void sendPacket(uint8_t* packet, size_t size) {<br />
  // Send the packet via UART to Tuya module<br />
  tuyaSerial.write(packet, size);<br />
<br />
  // Debug: Print the sent packet for logging<br />
  Serial.print("Sent packet: ");<br />
  for (size_t i = 0; i &lt; size; i++) {<br />
    Serial.print(packet[i], HEX);<br />
    Serial.print(" ");<br />
  }<br />
  Serial.println();<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7517" target="_blank" title="">9-tuya-wifi-config.zip</a> (Size: 2 KB / Downloads: 745)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7518" target="_blank" title="">9-tuya-wifi-config.ino.merged.zip</a> (Size: 184.92 KB / Downloads: 761)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-08 Ethernet W5500 chip work with TCP Server mode]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7992</link>
			<pubDate>Sun, 20 Apr 2025 15:17:36 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7992</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * This Arduino program sets up an ESP32-S3 with a W5500 Ethernet module<br />
 * as a TCP server. It listens on port 4196 and echoes back any string <br />
 * received from a client.<br />
 *<br />
 * Hardware connections:<br />
 * - CLK: GPIO42<br />
 * - MOSI: GPIO43<br />
 * - MISO: GPIO44<br />
 * - CS: GPIO41<br />
 * - RST: GPIO1<br />
 * - INT: GPIO2<br />
 *<br />
 * Static IP address: 192.168.3.55<br />
 * Subnet Mask: 255.255.255.0<br />
 * Gateway: 192.168.3.1<br />
 * DNS: 192.168.3.1<br />
 */<br />
<br />
#include &lt;SPI.h&gt;<br />
#include &lt;Ethernet.h&gt;<br />
<br />
// Define the W5500 Ethernet module pins<br />
#define W5500_CS_PIN  41<br />
#define W5500_RST_PIN 1<br />
#define W5500_INT_PIN 2<br />
#define W5500_CLK_PIN 42<br />
#define W5500_MOSI_PIN 43<br />
#define W5500_MISO_PIN 44<br />
<br />
// MAC address for your Ethernet shield (must be unique on your network)<br />
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };<br />
<br />
// Static IP address configuration<br />
IPAddress ip(192, 168, 3, 55);     &nbsp;&nbsp;// Static IP address<br />
IPAddress subnet(255, 255, 255, 0); &nbsp;&nbsp;// Subnet mask<br />
IPAddress gateway(192, 168, 3, 1);    // Default gateway<br />
IPAddress dns(192, 168, 3, 1);        // DNS server address<br />
<br />
// Create an EthernetServer object to handle TCP connections<br />
EthernetServer server(4196);<br />
<br />
void setup() {<br />
  // Initialize serial communication<br />
  Serial.begin(115200);<br />
  while (!Serial) {<br />
    ; // Wait for serial port to connect<br />
  }<br />
<br />
  // Initialize the W5500 module<br />
  pinMode(W5500_RST_PIN, OUTPUT);<br />
  pinMode(W5500_INT_PIN, INPUT);<br />
  digitalWrite(W5500_RST_PIN, LOW);  // Reset the W5500 module<br />
  delay(100);                     &nbsp;&nbsp;// Wait for reset to complete<br />
  digitalWrite(W5500_RST_PIN, HIGH); // Release reset<br />
<br />
  // Initialize SPI with the correct pin definitions<br />
  SPI.begin(W5500_CLK_PIN, W5500_MISO_PIN, W5500_MOSI_PIN);<br />
<br />
  // Set up the Ethernet library with W5500-specific pins<br />
  Ethernet.init(W5500_CS_PIN);<br />
<br />
  // Start the Ethernet connection with static IP configuration<br />
  Ethernet.begin(mac, ip, dns, gateway, subnet);<br />
<br />
  // Print the IP address to the serial monitor<br />
  Serial.print("IP Address: ");<br />
  Serial.println(Ethernet.localIP());<br />
<br />
  // Start listening for incoming TCP connections<br />
  server.begin();<br />
}<br />
<br />
void loop() {<br />
  // Check for incoming client connections<br />
  EthernetClient client = server.available();<br />
  if (client) {<br />
    Serial.println("New client connected");<br />
<br />
    // Read data from the client and echo it back<br />
    while (client.connected()) {<br />
      if (client.available()) {<br />
        char c = client.read();<br />
        server.write(c);<br />
      }<br />
    }<br />
<br />
    // Close the connection when done<br />
    client.stop();<br />
    Serial.println("Client disconnected");<br />
  }<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7515" target="_blank" title="">8-Ethernet-W5500.zip</a> (Size: 1.23 KB / Downloads: 693)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7516" target="_blank" title="">8-Ethernet-W5500.ino.merged.zip</a> (Size: 188.93 KB / Downloads: 707)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * This Arduino program sets up an ESP32-S3 with a W5500 Ethernet module<br />
 * as a TCP server. It listens on port 4196 and echoes back any string <br />
 * received from a client.<br />
 *<br />
 * Hardware connections:<br />
 * - CLK: GPIO42<br />
 * - MOSI: GPIO43<br />
 * - MISO: GPIO44<br />
 * - CS: GPIO41<br />
 * - RST: GPIO1<br />
 * - INT: GPIO2<br />
 *<br />
 * Static IP address: 192.168.3.55<br />
 * Subnet Mask: 255.255.255.0<br />
 * Gateway: 192.168.3.1<br />
 * DNS: 192.168.3.1<br />
 */<br />
<br />
#include &lt;SPI.h&gt;<br />
#include &lt;Ethernet.h&gt;<br />
<br />
// Define the W5500 Ethernet module pins<br />
#define W5500_CS_PIN  41<br />
#define W5500_RST_PIN 1<br />
#define W5500_INT_PIN 2<br />
#define W5500_CLK_PIN 42<br />
#define W5500_MOSI_PIN 43<br />
#define W5500_MISO_PIN 44<br />
<br />
// MAC address for your Ethernet shield (must be unique on your network)<br />
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };<br />
<br />
// Static IP address configuration<br />
IPAddress ip(192, 168, 3, 55);     &nbsp;&nbsp;// Static IP address<br />
IPAddress subnet(255, 255, 255, 0); &nbsp;&nbsp;// Subnet mask<br />
IPAddress gateway(192, 168, 3, 1);    // Default gateway<br />
IPAddress dns(192, 168, 3, 1);        // DNS server address<br />
<br />
// Create an EthernetServer object to handle TCP connections<br />
EthernetServer server(4196);<br />
<br />
void setup() {<br />
  // Initialize serial communication<br />
  Serial.begin(115200);<br />
  while (!Serial) {<br />
    ; // Wait for serial port to connect<br />
  }<br />
<br />
  // Initialize the W5500 module<br />
  pinMode(W5500_RST_PIN, OUTPUT);<br />
  pinMode(W5500_INT_PIN, INPUT);<br />
  digitalWrite(W5500_RST_PIN, LOW);  // Reset the W5500 module<br />
  delay(100);                     &nbsp;&nbsp;// Wait for reset to complete<br />
  digitalWrite(W5500_RST_PIN, HIGH); // Release reset<br />
<br />
  // Initialize SPI with the correct pin definitions<br />
  SPI.begin(W5500_CLK_PIN, W5500_MISO_PIN, W5500_MOSI_PIN);<br />
<br />
  // Set up the Ethernet library with W5500-specific pins<br />
  Ethernet.init(W5500_CS_PIN);<br />
<br />
  // Start the Ethernet connection with static IP configuration<br />
  Ethernet.begin(mac, ip, dns, gateway, subnet);<br />
<br />
  // Print the IP address to the serial monitor<br />
  Serial.print("IP Address: ");<br />
  Serial.println(Ethernet.localIP());<br />
<br />
  // Start listening for incoming TCP connections<br />
  server.begin();<br />
}<br />
<br />
void loop() {<br />
  // Check for incoming client connections<br />
  EthernetClient client = server.available();<br />
  if (client) {<br />
    Serial.println("New client connected");<br />
<br />
    // Read data from the client and echo it back<br />
    while (client.connected()) {<br />
      if (client.available()) {<br />
        char c = client.read();<br />
        server.write(c);<br />
      }<br />
    }<br />
<br />
    // Close the connection when done<br />
    client.stop();<br />
    Serial.println("Client disconnected");<br />
  }<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7515" target="_blank" title="">8-Ethernet-W5500.zip</a> (Size: 1.23 KB / Downloads: 693)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7516" target="_blank" title="">8-Ethernet-W5500.ino.merged.zip</a> (Size: 188.93 KB / Downloads: 707)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-07 how to DS3231 RTC clock]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7991</link>
			<pubDate>Sun, 20 Apr 2025 15:15:16 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7991</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * DS3231 RTC with Arduino<br />
 *<br />
 * This program demonstrates how to use the DS3231 RTC (Real-Time Clock) module with the Arduino.<br />
 * It includes functionality to:<br />
 * - Initialize the DS3231 RTC module<br />
 * - Read the current date and time from the RTC<br />
 * - Set the RTC time based on a serial command:Command format: DYYYY-MM-DDTHH:MM:SS<br />
 *<br />
 * Hardware Connections:<br />
 * - SDA: GPIO 8<br />
 * - SCL: GPIO 18<br />
 */<br />
<br />
#include &lt;DS3231.h&gt;<br />
#include &lt;Wire.h&gt;<br />
<br />
String serial_cmd_rcv = ""; // Serial port receiver<br />
<br />
typedef struct<br />
{<br />
  byte year;    // Last two digits of the year, library adds 2000.<br />
  byte month;<br />
  byte day;<br />
  byte hour;<br />
  byte minute;<br />
  byte second;<br />
} MY_DATE_STR;<br />
<br />
MY_DATE_STR my_date_str = {0};<br />
<br />
// Define constants for relay control<br />
#define OPEN_RLY_DATA    26<br />
#define OPEN_RLY_MONTH &nbsp;&nbsp;4<br />
#define CLOSE_RLY_DATA &nbsp;&nbsp;2<br />
#define CLOSE_RLY_MONTH  5<br />
<br />
// Define pin connections<br />
#define SDA_PIN &nbsp;&nbsp;8<br />
#define SCL_PIN &nbsp;&nbsp;18<br />
<br />
DS3231 rtc; // Create an instance of the DS3231 RTC<br />
bool h12Flag;<br />
bool pmFlag;<br />
static bool bCentury = false;<br />
static bool old_level_high = false;<br />
static bool old_level_low = false;<br />
<br />
<br />
/**<br />
 * @brief Print the current time from the RTC to the Serial Monitor.<br />
 */<br />
static void PrintfCurTime()<br />
{<br />
  Serial.print("Current time is: ");<br />
  int year = rtc.getYear() + 2000;<br />
  Serial.print(year);<br />
  Serial.print("-");<br />
<br />
  Serial.print(rtc.getMonth(bCentury), DEC);<br />
  Serial.print("-");<br />
<br />
  Serial.print(rtc.getDate(), DEC);<br />
  Serial.print(" ");<br />
<br />
  Serial.print(rtc.getHour(h12Flag, pmFlag), DEC);<br />
  Serial.print(":");<br />
  Serial.print(rtc.getMinute(), DEC);<br />
  Serial.print(":");<br />
  Serial.println(rtc.getSecond(), DEC);<br />
}<br />
<br />
/**<br />
 * @brief Process serial commands to set the RTC time.<br />
 * Command format: DYYYY-MM-DDTHH:MM:SS<br />
 */<br />
static void GetSerialCmd()<br />
{<br />
  if (Serial.available() &gt; 0)<br />
  {<br />
    delay(100);<br />
    int num_read = Serial.available();<br />
    while (num_read--)<br />
      serial_cmd_rcv += char(Serial.read());<br />
  }<br />
  else return;<br />
<br />
  serial_cmd_rcv.trim();<br />
<br />
  if (serial_cmd_rcv == "current time")<br />
  {<br />
    PrintfCurTime();<br />
    serial_cmd_rcv = "";<br />
    return;<br />
  }<br />
<br />
  Serial.print("Received length: ");<br />
  Serial.println(serial_cmd_rcv.length());<br />
<br />
  int indexof_d = serial_cmd_rcv.indexOf('D');<br />
  int indexof_t = serial_cmd_rcv.indexOf('T');<br />
<br />
  Serial.print("D index: ");<br />
  Serial.print(indexof_d);<br />
  Serial.print(" T index: ");<br />
  Serial.println(indexof_t);<br />
<br />
  if (serial_cmd_rcv.length() != 20 || <br />
      serial_cmd_rcv.substring(0, 1) != "D" ||<br />
      serial_cmd_rcv.substring(11, 12) != "T")  <br />
  {<br />
    Serial.println(serial_cmd_rcv);<br />
    serial_cmd_rcv = "";<br />
    return;<br />
  }<br />
<br />
  Serial.println("Setting time...");<br />
<br />
  my_date_str.year = (byte)serial_cmd_rcv.substring(3, 5).toInt();<br />
  my_date_str.month = (byte)serial_cmd_rcv.substring(6, 8).toInt();<br />
  my_date_str.day = (byte)serial_cmd_rcv.substring(9, 11).toInt();<br />
  my_date_str.hour = (byte)serial_cmd_rcv.substring(12, 14).toInt();<br />
  my_date_str.minute = (byte)serial_cmd_rcv.substring(15, 17).toInt();<br />
  my_date_str.second = (byte)serial_cmd_rcv.substring(18).toInt();<br />
<br />
  rtc.setYear(my_date_str.year);<br />
  rtc.setMonth(my_date_str.month);<br />
  rtc.setDate(my_date_str.day);<br />
  rtc.setHour(my_date_str.hour);<br />
  rtc.setMinute(my_date_str.minute);<br />
  rtc.setSecond(my_date_str.second);<br />
<br />
  serial_cmd_rcv = "";<br />
<br />
  Serial.println("Time set.");<br />
}<br />
<br />
void setup() {<br />
  // Initialize the I2C interface<br />
  Wire.begin(SDA_PIN, SCL_PIN, 40000);<br />
  <br />
  // Initialize Serial communication<br />
  Serial.begin(115200);<br />
 &nbsp;&nbsp;<br />
  // Set the RTC to 24-hour mode<br />
  rtc.setClockMode(false); // 24-hour format<br />
<br />
  // Print current time to Serial Monitor<br />
  PrintfCurTime();<br />
<br />
  // Clear any remaining serial data<br />
  while (Serial.read() &gt;= 0) {}<br />
}<br />
<br />
void loop() {<br />
  // Process incoming serial commands<br />
  GetSerialCmd(); <br />
  delay(1000); // Delay for 1 second<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7513" target="_blank" title="">7-DS3231-RTC.zip</a> (Size: 1.51 KB / Downloads: 688)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7514" target="_blank" title="">7-DS3231-RTC.ino.merged.zip</a> (Size: 191.08 KB / Downloads: 707)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * DS3231 RTC with Arduino<br />
 *<br />
 * This program demonstrates how to use the DS3231 RTC (Real-Time Clock) module with the Arduino.<br />
 * It includes functionality to:<br />
 * - Initialize the DS3231 RTC module<br />
 * - Read the current date and time from the RTC<br />
 * - Set the RTC time based on a serial command:Command format: DYYYY-MM-DDTHH:MM:SS<br />
 *<br />
 * Hardware Connections:<br />
 * - SDA: GPIO 8<br />
 * - SCL: GPIO 18<br />
 */<br />
<br />
#include &lt;DS3231.h&gt;<br />
#include &lt;Wire.h&gt;<br />
<br />
String serial_cmd_rcv = ""; // Serial port receiver<br />
<br />
typedef struct<br />
{<br />
  byte year;    // Last two digits of the year, library adds 2000.<br />
  byte month;<br />
  byte day;<br />
  byte hour;<br />
  byte minute;<br />
  byte second;<br />
} MY_DATE_STR;<br />
<br />
MY_DATE_STR my_date_str = {0};<br />
<br />
// Define constants for relay control<br />
#define OPEN_RLY_DATA    26<br />
#define OPEN_RLY_MONTH &nbsp;&nbsp;4<br />
#define CLOSE_RLY_DATA &nbsp;&nbsp;2<br />
#define CLOSE_RLY_MONTH  5<br />
<br />
// Define pin connections<br />
#define SDA_PIN &nbsp;&nbsp;8<br />
#define SCL_PIN &nbsp;&nbsp;18<br />
<br />
DS3231 rtc; // Create an instance of the DS3231 RTC<br />
bool h12Flag;<br />
bool pmFlag;<br />
static bool bCentury = false;<br />
static bool old_level_high = false;<br />
static bool old_level_low = false;<br />
<br />
<br />
/**<br />
 * @brief Print the current time from the RTC to the Serial Monitor.<br />
 */<br />
static void PrintfCurTime()<br />
{<br />
  Serial.print("Current time is: ");<br />
  int year = rtc.getYear() + 2000;<br />
  Serial.print(year);<br />
  Serial.print("-");<br />
<br />
  Serial.print(rtc.getMonth(bCentury), DEC);<br />
  Serial.print("-");<br />
<br />
  Serial.print(rtc.getDate(), DEC);<br />
  Serial.print(" ");<br />
<br />
  Serial.print(rtc.getHour(h12Flag, pmFlag), DEC);<br />
  Serial.print(":");<br />
  Serial.print(rtc.getMinute(), DEC);<br />
  Serial.print(":");<br />
  Serial.println(rtc.getSecond(), DEC);<br />
}<br />
<br />
/**<br />
 * @brief Process serial commands to set the RTC time.<br />
 * Command format: DYYYY-MM-DDTHH:MM:SS<br />
 */<br />
static void GetSerialCmd()<br />
{<br />
  if (Serial.available() &gt; 0)<br />
  {<br />
    delay(100);<br />
    int num_read = Serial.available();<br />
    while (num_read--)<br />
      serial_cmd_rcv += char(Serial.read());<br />
  }<br />
  else return;<br />
<br />
  serial_cmd_rcv.trim();<br />
<br />
  if (serial_cmd_rcv == "current time")<br />
  {<br />
    PrintfCurTime();<br />
    serial_cmd_rcv = "";<br />
    return;<br />
  }<br />
<br />
  Serial.print("Received length: ");<br />
  Serial.println(serial_cmd_rcv.length());<br />
<br />
  int indexof_d = serial_cmd_rcv.indexOf('D');<br />
  int indexof_t = serial_cmd_rcv.indexOf('T');<br />
<br />
  Serial.print("D index: ");<br />
  Serial.print(indexof_d);<br />
  Serial.print(" T index: ");<br />
  Serial.println(indexof_t);<br />
<br />
  if (serial_cmd_rcv.length() != 20 || <br />
      serial_cmd_rcv.substring(0, 1) != "D" ||<br />
      serial_cmd_rcv.substring(11, 12) != "T")  <br />
  {<br />
    Serial.println(serial_cmd_rcv);<br />
    serial_cmd_rcv = "";<br />
    return;<br />
  }<br />
<br />
  Serial.println("Setting time...");<br />
<br />
  my_date_str.year = (byte)serial_cmd_rcv.substring(3, 5).toInt();<br />
  my_date_str.month = (byte)serial_cmd_rcv.substring(6, 8).toInt();<br />
  my_date_str.day = (byte)serial_cmd_rcv.substring(9, 11).toInt();<br />
  my_date_str.hour = (byte)serial_cmd_rcv.substring(12, 14).toInt();<br />
  my_date_str.minute = (byte)serial_cmd_rcv.substring(15, 17).toInt();<br />
  my_date_str.second = (byte)serial_cmd_rcv.substring(18).toInt();<br />
<br />
  rtc.setYear(my_date_str.year);<br />
  rtc.setMonth(my_date_str.month);<br />
  rtc.setDate(my_date_str.day);<br />
  rtc.setHour(my_date_str.hour);<br />
  rtc.setMinute(my_date_str.minute);<br />
  rtc.setSecond(my_date_str.second);<br />
<br />
  serial_cmd_rcv = "";<br />
<br />
  Serial.println("Time set.");<br />
}<br />
<br />
void setup() {<br />
  // Initialize the I2C interface<br />
  Wire.begin(SDA_PIN, SCL_PIN, 40000);<br />
  <br />
  // Initialize Serial communication<br />
  Serial.begin(115200);<br />
 &nbsp;&nbsp;<br />
  // Set the RTC to 24-hour mode<br />
  rtc.setClockMode(false); // 24-hour format<br />
<br />
  // Print current time to Serial Monitor<br />
  PrintfCurTime();<br />
<br />
  // Clear any remaining serial data<br />
  while (Serial.read() &gt;= 0) {}<br />
}<br />
<br />
void loop() {<br />
  // Process incoming serial commands<br />
  GetSerialCmd(); <br />
  delay(1000); // Delay for 1 second<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7513" target="_blank" title="">7-DS3231-RTC.zip</a> (Size: 1.51 KB / Downloads: 688)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7514" target="_blank" title="">7-DS3231-RTC.ino.merged.zip</a> (Size: 191.08 KB / Downloads: 707)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-06 How to use SD Card]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7990</link>
			<pubDate>Sun, 20 Apr 2025 15:13:57 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7990</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * SD Card File Operations<br />
 *<br />
 * This program demonstrates basic file operations on an SD card using the ESP32.<br />
 * It includes functionality to:<br />
 * - Initialize and test the SD card<br />
 * - Read from, write to, append to, and delete files on the SD card<br />
 * - Measure file read and write performance<br />
 *<br />
 * Hardware Connections:<br />
 * - SCK: GPIO 11<br />
 * - MISO: GPIO 12<br />
 * - MOSI: GPIO 10<br />
 * - CS: GPIO 9<br />
 */<br />
<br />
#include "FS.h"<br />
#include "SD.h"<br />
#include "SPI.h"<br />
<br />
// Pin definitions for SD card<br />
#define SCK  11<br />
#define MISO 12<br />
#define MOSI 10<br />
#define CS &nbsp;&nbsp;9<br />
<br />
/**<br />
 * @brief Reads the contents of a file from the SD card and prints it to the serial monitor.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to read.<br />
 */<br />
void readFile(fs::FS &amp;fs, const char * path) {<br />
  Serial.printf("Reading file: %s&#92;n", path);<br />
<br />
  File file = fs.open(path);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for reading");<br />
    return;<br />
  }<br />
<br />
  Serial.print("Read from file: ");<br />
  while (file.available()) {<br />
    Serial.print((char)file.read());<br />
  }<br />
  file.close();<br />
}<br />
<br />
/**<br />
 * @brief Writes a message to a file on the SD card.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to write.<br />
 * @param message Message to write to the file.<br />
 */<br />
void writeFile(fs::FS &amp;fs, const char * path, const char * message) {<br />
  Serial.printf("Writing file: %s&#92;n", path);<br />
<br />
  File file = fs.open(path, FILE_WRITE);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for writing");<br />
    return;<br />
  }<br />
  if (file.print(message)) {<br />
    Serial.println("File written");<br />
  } else {<br />
    Serial.println("Write failed");<br />
  }<br />
  file.close();<br />
}<br />
<br />
/**<br />
 * @brief Appends a message to a file on the SD card.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to append.<br />
 * @param message Message to append to the file.<br />
 */<br />
void appendFile(fs::FS &amp;fs, const char * path, const char * message) {<br />
  Serial.printf("Appending to file: %s&#92;n", path);<br />
<br />
  File file = fs.open(path, FILE_APPEND);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for appending");<br />
    return;<br />
  }<br />
  if (file.print(message)) {<br />
    Serial.println("Message appended");<br />
  } else {<br />
    Serial.println("Append failed");<br />
  }<br />
  file.close();<br />
}<br />
<br />
/**<br />
 * @brief Deletes a file from the SD card.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to delete.<br />
 */<br />
void deleteFile(fs::FS &amp;fs, const char * path) {<br />
  Serial.printf("Deleting file: %s&#92;n", path);<br />
  if (fs.remove(path)) {<br />
    Serial.println("File deleted");<br />
  } else {<br />
    Serial.println("Delete failed");<br />
  }<br />
}<br />
<br />
/**<br />
 * @brief Tests file read and write performance.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to test.<br />
 */<br />
void testFileIO(fs::FS &amp;fs, const char * path) {<br />
  File file = fs.open(path);<br />
  static uint8_t buf[512];<br />
  size_t len = 0;<br />
  uint32_t start = millis();<br />
  uint32_t end = start;<br />
<br />
  if (file) {<br />
    len = file.size();<br />
    size_t flen = len;<br />
    start = millis();<br />
    while (len) {<br />
      size_t toRead = len;<br />
      if (toRead &gt; 512) {<br />
        toRead = 512;<br />
      }<br />
      file.read(buf, toRead);<br />
      len -= toRead;<br />
    }<br />
    end = millis() - start;<br />
    Serial.printf("%u bytes read for %u ms&#92;n", flen, end);<br />
    file.close();<br />
  } else {<br />
    Serial.println("Failed to open file for reading");<br />
  }<br />
<br />
  file = fs.open(path, FILE_WRITE);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for writing");<br />
    return;<br />
  }<br />
<br />
  size_t i;<br />
  start = millis();<br />
  for (i = 0; i &lt; 2048; i++) {<br />
    file.write(buf, 512);<br />
  }<br />
  end = millis() - start;<br />
  Serial.printf("%u bytes written for %u ms&#92;n", 2048 * 512, end);<br />
  file.close();<br />
}<br />
<br />
void setup() {<br />
  // Initialize serial communication<br />
  Serial.begin(115200);<br />
  <br />
  // Initialize SPI and SD card<br />
  SPIClass spi = SPIClass(HSPI);<br />
  spi.begin(SCK, MISO, MOSI, CS);<br />
<br />
  if (!SD.begin(CS, spi, 80000000)) {<br />
    Serial.println("Card Mount Failed");<br />
    return;<br />
  }<br />
<br />
  uint8_t cardType = SD.cardType();<br />
<br />
  if (cardType == CARD_NONE) {<br />
    Serial.println("No SD card attached");<br />
    return;<br />
  }<br />
<br />
  Serial.print("SD Card Type: ");<br />
  if (cardType == CARD_MMC) {<br />
    Serial.println("MMC");<br />
  } else if (cardType == CARD_SD) {<br />
    Serial.println("SDSC");<br />
  } else if (cardType == CARD_SDHC) {<br />
    Serial.println("SDHC");<br />
  } else {<br />
    Serial.println("UNKNOWN");<br />
  }<br />
<br />
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);<br />
  Serial.printf("SD Card Size: %lluMB&#92;n", cardSize);<br />
  delay(2000);<br />
<br />
  // Perform file operations<br />
  deleteFile(SD, "/hello.txt");<br />
  writeFile(SD, "/hello.txt", "Hello ");<br />
  appendFile(SD, "/hello.txt", "World!&#92;n");<br />
  readFile(SD, "/hello.txt");<br />
  testFileIO(SD, "/test.txt");<br />
  Serial.printf("Total space: %lluMB&#92;n", SD.totalBytes() / (1024 * 1024));<br />
  Serial.printf("Used space: %lluMB&#92;n", SD.usedBytes() / (1024 * 1024));<br />
}<br />
<br />
void loop() {<br />
  // No operation in loop<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7511" target="_blank" title="">6-SD.zip</a> (Size: 1.53 KB / Downloads: 682)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7512" target="_blank" title="">6-SD.ino.merged.zip</a> (Size: 221.25 KB / Downloads: 681)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/*<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 *<br />
 * SD Card File Operations<br />
 *<br />
 * This program demonstrates basic file operations on an SD card using the ESP32.<br />
 * It includes functionality to:<br />
 * - Initialize and test the SD card<br />
 * - Read from, write to, append to, and delete files on the SD card<br />
 * - Measure file read and write performance<br />
 *<br />
 * Hardware Connections:<br />
 * - SCK: GPIO 11<br />
 * - MISO: GPIO 12<br />
 * - MOSI: GPIO 10<br />
 * - CS: GPIO 9<br />
 */<br />
<br />
#include "FS.h"<br />
#include "SD.h"<br />
#include "SPI.h"<br />
<br />
// Pin definitions for SD card<br />
#define SCK  11<br />
#define MISO 12<br />
#define MOSI 10<br />
#define CS &nbsp;&nbsp;9<br />
<br />
/**<br />
 * @brief Reads the contents of a file from the SD card and prints it to the serial monitor.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to read.<br />
 */<br />
void readFile(fs::FS &amp;fs, const char * path) {<br />
  Serial.printf("Reading file: %s&#92;n", path);<br />
<br />
  File file = fs.open(path);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for reading");<br />
    return;<br />
  }<br />
<br />
  Serial.print("Read from file: ");<br />
  while (file.available()) {<br />
    Serial.print((char)file.read());<br />
  }<br />
  file.close();<br />
}<br />
<br />
/**<br />
 * @brief Writes a message to a file on the SD card.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to write.<br />
 * @param message Message to write to the file.<br />
 */<br />
void writeFile(fs::FS &amp;fs, const char * path, const char * message) {<br />
  Serial.printf("Writing file: %s&#92;n", path);<br />
<br />
  File file = fs.open(path, FILE_WRITE);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for writing");<br />
    return;<br />
  }<br />
  if (file.print(message)) {<br />
    Serial.println("File written");<br />
  } else {<br />
    Serial.println("Write failed");<br />
  }<br />
  file.close();<br />
}<br />
<br />
/**<br />
 * @brief Appends a message to a file on the SD card.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to append.<br />
 * @param message Message to append to the file.<br />
 */<br />
void appendFile(fs::FS &amp;fs, const char * path, const char * message) {<br />
  Serial.printf("Appending to file: %s&#92;n", path);<br />
<br />
  File file = fs.open(path, FILE_APPEND);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for appending");<br />
    return;<br />
  }<br />
  if (file.print(message)) {<br />
    Serial.println("Message appended");<br />
  } else {<br />
    Serial.println("Append failed");<br />
  }<br />
  file.close();<br />
}<br />
<br />
/**<br />
 * @brief Deletes a file from the SD card.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to delete.<br />
 */<br />
void deleteFile(fs::FS &amp;fs, const char * path) {<br />
  Serial.printf("Deleting file: %s&#92;n", path);<br />
  if (fs.remove(path)) {<br />
    Serial.println("File deleted");<br />
  } else {<br />
    Serial.println("Delete failed");<br />
  }<br />
}<br />
<br />
/**<br />
 * @brief Tests file read and write performance.<br />
 * <br />
 * @param fs File system to use (in this case, SD).<br />
 * @param path Path of the file to test.<br />
 */<br />
void testFileIO(fs::FS &amp;fs, const char * path) {<br />
  File file = fs.open(path);<br />
  static uint8_t buf[512];<br />
  size_t len = 0;<br />
  uint32_t start = millis();<br />
  uint32_t end = start;<br />
<br />
  if (file) {<br />
    len = file.size();<br />
    size_t flen = len;<br />
    start = millis();<br />
    while (len) {<br />
      size_t toRead = len;<br />
      if (toRead &gt; 512) {<br />
        toRead = 512;<br />
      }<br />
      file.read(buf, toRead);<br />
      len -= toRead;<br />
    }<br />
    end = millis() - start;<br />
    Serial.printf("%u bytes read for %u ms&#92;n", flen, end);<br />
    file.close();<br />
  } else {<br />
    Serial.println("Failed to open file for reading");<br />
  }<br />
<br />
  file = fs.open(path, FILE_WRITE);<br />
  if (!file) {<br />
    Serial.println("Failed to open file for writing");<br />
    return;<br />
  }<br />
<br />
  size_t i;<br />
  start = millis();<br />
  for (i = 0; i &lt; 2048; i++) {<br />
    file.write(buf, 512);<br />
  }<br />
  end = millis() - start;<br />
  Serial.printf("%u bytes written for %u ms&#92;n", 2048 * 512, end);<br />
  file.close();<br />
}<br />
<br />
void setup() {<br />
  // Initialize serial communication<br />
  Serial.begin(115200);<br />
  <br />
  // Initialize SPI and SD card<br />
  SPIClass spi = SPIClass(HSPI);<br />
  spi.begin(SCK, MISO, MOSI, CS);<br />
<br />
  if (!SD.begin(CS, spi, 80000000)) {<br />
    Serial.println("Card Mount Failed");<br />
    return;<br />
  }<br />
<br />
  uint8_t cardType = SD.cardType();<br />
<br />
  if (cardType == CARD_NONE) {<br />
    Serial.println("No SD card attached");<br />
    return;<br />
  }<br />
<br />
  Serial.print("SD Card Type: ");<br />
  if (cardType == CARD_MMC) {<br />
    Serial.println("MMC");<br />
  } else if (cardType == CARD_SD) {<br />
    Serial.println("SDSC");<br />
  } else if (cardType == CARD_SDHC) {<br />
    Serial.println("SDHC");<br />
  } else {<br />
    Serial.println("UNKNOWN");<br />
  }<br />
<br />
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);<br />
  Serial.printf("SD Card Size: %lluMB&#92;n", cardSize);<br />
  delay(2000);<br />
<br />
  // Perform file operations<br />
  deleteFile(SD, "/hello.txt");<br />
  writeFile(SD, "/hello.txt", "Hello ");<br />
  appendFile(SD, "/hello.txt", "World!&#92;n");<br />
  readFile(SD, "/hello.txt");<br />
  testFileIO(SD, "/test.txt");<br />
  Serial.printf("Total space: %lluMB&#92;n", SD.totalBytes() / (1024 * 1024));<br />
  Serial.printf("Used space: %lluMB&#92;n", SD.usedBytes() / (1024 * 1024));<br />
}<br />
<br />
void loop() {<br />
  // No operation in loop<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7511" target="_blank" title="">6-SD.zip</a> (Size: 1.53 KB / Downloads: 682)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7512" target="_blank" title="">6-SD.ino.merged.zip</a> (Size: 221.25 KB / Downloads: 681)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[arduino code examples for F8]-05 Read free GPIO state]]></title>
			<link>https://www.kincony.com/forum/showthread.php?tid=7989</link>
			<pubDate>Sun, 20 Apr 2025 15:12:37 +0800</pubDate>
			<dc:creator><![CDATA[<a href="https://www.kincony.com/forum/member.php?action=profile&uid=1">admin</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.kincony.com/forum/showthread.php?tid=7989</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/**<br />
 * @brief Example to read multiple digital inputs using ESP32<br />
 * @details This program reads the states of GPIO48, GPIO47, GPIO21, GPIO15, GPIO14, and GPIO40<br />
 *          and prints the results to the Serial Monitor.<br />
 *<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 */<br />
<br />
// Define the GPIO pins for digital inputs<br />
#define INPUT1_PIN 48  // GPIO48<br />
#define INPUT2_PIN 47  // GPIO47<br />
#define INPUT3_PIN 21  // GPIO21<br />
#define INPUT4_PIN 15  // GPIO15<br />
#define INPUT5_PIN 14  // GPIO14<br />
#define INPUT6_PIN 40  // GPIO40<br />
#define INPUT7_PIN 0  // GPIO0<br />
<br />
void setup() {<br />
    // Initialize the serial communication for debugging<br />
    Serial.begin(115200);<br />
    Serial.println("ESP32 Digital Input Read Example");<br />
<br />
    // Set the input pins as INPUT<br />
    pinMode(INPUT1_PIN, INPUT);<br />
    pinMode(INPUT2_PIN, INPUT);<br />
    pinMode(INPUT3_PIN, INPUT);<br />
    pinMode(INPUT4_PIN, INPUT);<br />
    pinMode(INPUT5_PIN, INPUT);<br />
    pinMode(INPUT6_PIN, INPUT);<br />
    pinMode(INPUT7_PIN, INPUT);<br />
}<br />
<br />
void loop() {<br />
    // Read the state of the digital inputs<br />
    int state1 = digitalRead(INPUT1_PIN);<br />
    int state2 = digitalRead(INPUT2_PIN);<br />
    int state3 = digitalRead(INPUT3_PIN);<br />
    int state4 = digitalRead(INPUT4_PIN);<br />
    int state5 = digitalRead(INPUT5_PIN);<br />
    int state6 = digitalRead(INPUT6_PIN);<br />
    int state7 = digitalRead(INPUT7_PIN);<br />
<br />
    // Print the states to the Serial Monitor<br />
    Serial.print("GPIO48 State: ");<br />
    Serial.println(state1);<br />
    Serial.print("GPIO47 State: ");<br />
    Serial.println(state2);<br />
    Serial.print("GPIO21 State: ");<br />
    Serial.println(state3);<br />
    Serial.print("GPIO15 State: ");<br />
    Serial.println(state4);<br />
    Serial.print("GPIO14 State: ");<br />
    Serial.println(state5);<br />
    Serial.print("GPIO40 State: ");<br />
    Serial.println(state6);<br />
    Serial.print("GPIO0 State: ");<br />
    Serial.println(state7);<br />
    // Wait for 500 milliseconds before reading again<br />
    delay(500);<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7509" target="_blank" title="">5-free-gpio-state.zip</a> (Size: 780 bytes / Downloads: 683)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7510" target="_blank" title="">5-free-gpio-state.ino.merged.zip</a> (Size: 179.5 KB / Downloads: 692)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>/**<br />
 * @brief Example to read multiple digital inputs using ESP32<br />
 * @details This program reads the states of GPIO48, GPIO47, GPIO21, GPIO15, GPIO14, and GPIO40<br />
 *          and prints the results to the Serial Monitor.<br />
 *<br />
 * Made by KinCony IoT: https://www.kincony.com<br />
 */<br />
<br />
// Define the GPIO pins for digital inputs<br />
#define INPUT1_PIN 48  // GPIO48<br />
#define INPUT2_PIN 47  // GPIO47<br />
#define INPUT3_PIN 21  // GPIO21<br />
#define INPUT4_PIN 15  // GPIO15<br />
#define INPUT5_PIN 14  // GPIO14<br />
#define INPUT6_PIN 40  // GPIO40<br />
#define INPUT7_PIN 0  // GPIO0<br />
<br />
void setup() {<br />
    // Initialize the serial communication for debugging<br />
    Serial.begin(115200);<br />
    Serial.println("ESP32 Digital Input Read Example");<br />
<br />
    // Set the input pins as INPUT<br />
    pinMode(INPUT1_PIN, INPUT);<br />
    pinMode(INPUT2_PIN, INPUT);<br />
    pinMode(INPUT3_PIN, INPUT);<br />
    pinMode(INPUT4_PIN, INPUT);<br />
    pinMode(INPUT5_PIN, INPUT);<br />
    pinMode(INPUT6_PIN, INPUT);<br />
    pinMode(INPUT7_PIN, INPUT);<br />
}<br />
<br />
void loop() {<br />
    // Read the state of the digital inputs<br />
    int state1 = digitalRead(INPUT1_PIN);<br />
    int state2 = digitalRead(INPUT2_PIN);<br />
    int state3 = digitalRead(INPUT3_PIN);<br />
    int state4 = digitalRead(INPUT4_PIN);<br />
    int state5 = digitalRead(INPUT5_PIN);<br />
    int state6 = digitalRead(INPUT6_PIN);<br />
    int state7 = digitalRead(INPUT7_PIN);<br />
<br />
    // Print the states to the Serial Monitor<br />
    Serial.print("GPIO48 State: ");<br />
    Serial.println(state1);<br />
    Serial.print("GPIO47 State: ");<br />
    Serial.println(state2);<br />
    Serial.print("GPIO21 State: ");<br />
    Serial.println(state3);<br />
    Serial.print("GPIO15 State: ");<br />
    Serial.println(state4);<br />
    Serial.print("GPIO14 State: ");<br />
    Serial.println(state5);<br />
    Serial.print("GPIO40 State: ");<br />
    Serial.println(state6);<br />
    Serial.print("GPIO0 State: ");<br />
    Serial.println(state7);<br />
    // Wait for 500 milliseconds before reading again<br />
    delay(500);<br />
}</code></div></div> arduino ino file download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7509" target="_blank" title="">5-free-gpio-state.zip</a> (Size: 780 bytes / Downloads: 683)
<!-- end: postbit_attachments_attachment --><br />
BIN file (you can use esp32 download tool download to ESP32-S3 with address 0x0 then directly to use) download: <br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.kincony.com/forum/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=7510" target="_blank" title="">5-free-gpio-state.ino.merged.zip</a> (Size: 179.5 KB / Downloads: 692)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>