{"id":359,"date":"2026-07-26T13:07:14","date_gmt":"2026-07-26T06:07:14","guid":{"rendered":"https:\/\/navy007.com\/WP\/?p=359"},"modified":"2026-07-26T13:07:14","modified_gmt":"2026-07-26T06:07:14","slug":"esp32-ep-7-esp32-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%9b%e0%b9%87%e0%b8%99-rc-meter","status":"publish","type":"post","link":"https:\/\/navy007.com\/WP\/archives\/359","title":{"rendered":"ESP32 (EP.7) ESP32 \u0e17\u0e33\u0e40\u0e1b\u0e47\u0e19 RC meter"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 ESP32 \u0e17\u0e33\u0e40\u0e1b\u0e47\u0e19 RC meter &#8230;. \u0e02\u0e2d\u0e40\u0e23\u0e34\u0e48\u0e21\u0e17\u0e35\u0e48\u0e01\u0e32\u0e23\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e01\u0e48\u0e2d\u0e19\u00a0\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19\u0e17\u0e35\u0e48\u0e07\u0e48\u0e32\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e30\u0e44\u0e14\u0e49\u0e1c\u0e25\u0e14\u0e35\u0e21\u0e32\u0e01\u0e1e\u0e2d\u0e2a\u0e21\u0e04\u0e27\u0e23\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e15\u0e31\u0e27\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 (Voltage divider)\u00a0\u00a0\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e19\u0e31\u0e49\u0e19\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e27\u0e07\u0e08\u0e23\u0e41\u0e25\u0e30\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1b\u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u00a0\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e22\u0e32\u0e01\u0e40\u0e25\u0e22\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\u0e21\u0e31\u0e19\u0e01\u0e47\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e0e\u0e02\u0e2d\u0e07\u0e42\u0e2d\u0e2b\u0e4c\u0e21\u0e18\u0e23\u0e23\u0e21\u0e14\u0e32\u0e19\u0e35\u0e48\u0e40\u0e2d\u0e07\u0e04\u0e23\u0e31\u0e1a&nbsp;&nbsp;\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e22\u0e38\u0e01\u0e15\u0e4c\u0e43\u0e0a\u0e49\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e44\u0e14\u0e49\u0e01\u0e47\u0e04\u0e37\u0e2d&nbsp;&nbsp;\u0e15\u0e48\u0e2d V<sub>out<\/sub>&nbsp;\u0e02\u0e2d\u0e07\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e01\u0e31\u0e1a GPIO \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19&nbsp;&nbsp;\u0e42\u0e14\u0e22\u0e21\u0e35\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 V<sub>in<\/sub>&nbsp;\u0e19\u0e33\u0e21\u0e32\u0e08\u0e32\u0e01\u0e44\u0e1f 3.3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e02\u0e2d\u0e07 ESP32 \u0e40\u0e2d\u0e07&nbsp;&nbsp;\u0e41\u0e25\u0e30 V<sub>out<\/sub>&nbsp;\u0e01\u0e47\u0e15\u0e48\u0e2d\u0e15\u0e23\u0e07\u0e01\u0e31\u0e1a GPIO \u0e02\u0e2d\u0e07 ESP32 \u0e43\u0e19 ADC mode<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/780\/091\/000\/mrvkc4sa2a5bQ6ThQx9rkC-o.png\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;\u0e43\u0e19\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49&nbsp;&nbsp;\u0e15\u0e31\u0e27\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e08\u0e30\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e15\u0e31\u0e27 R<sub>1&nbsp;<\/sub>&#8230;.. \u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27 R<sub>2<\/sub>&nbsp;\u0e08\u0e30\u0e43\u0e0a\u0e49 R \u0e04\u0e48\u0e32\u0e04\u0e07\u0e17\u0e35\u0e48&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07\u0e08\u0e32\u0e01\u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 input \u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07 3.3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e04\u0e48\u0e32\u0e02\u0e2d\u0e07 R<sub>2<\/sub>&nbsp;\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e01\u0e47\u0e04\u0e37\u0e2d 22k\u03a9 &#8230;. \u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19\u0e01\u0e32\u0e23\u0e2b\u0e32\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e2a\u0e48\u0e43\u0e19 code \u0e40\u0e23\u0e32\u0e01\u0e47\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e22\u0e49\u0e32\u0e22\u0e02\u0e49\u0e32\u0e07\u0e2a\u0e21\u0e01\u0e32\u0e23 \u0e42\u0e14\u0e22\u0e43\u0e19\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e41\u0e17\u0e19\u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 V<sub>in<\/sub>&nbsp;= 3.3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e41\u0e25\u0e30\u0e04\u0e48\u0e32\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e1a 22k\u03a9&nbsp;&nbsp;\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e41\u0e25\u0e49\u0e27\u0e08\u0e30\u0e44\u0e14\u0e49\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e08\u0e30\u0e19\u0e33\u0e44\u0e1b\u0e43\u0e2a\u0e48\u0e43\u0e19 code \u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/780\/091\/000\/mrvkcic01yVw95zdXZmX-o.png\" alt=\"\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e2a\u0e48\u0e27\u0e19\u0e01\u0e32\u0e23\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32 Capacitor \u0e27\u0e34\u0e18\u0e35\u0e17\u0e35\u0e48\u0e07\u0e48\u0e32\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e15\u0e48\u0e2d\u0e27\u0e07\u0e08\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e14\u0e22\u0e43\u0e0a\u0e49 IC 555 timer \u0e04\u0e23\u0e31\u0e1a<br>\u0e08\u0e30\u0e02\u0e2d\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e16\u0e36\u0e07\u0e27\u0e07\u0e08\u0e23\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a IC 555 timer \u0e15\u0e31\u0e27\u0e19\u0e35\u0e49\u0e01\u0e48\u0e2d\u0e19 (\u0e20\u0e32\u0e1e\u0e25\u0e48\u0e32\u0e07) \u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d IC 555 \u0e43\u0e19\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30\u0e19\u0e35\u0e49\u0e08\u0e30\u0e40\u0e23\u0e35\u0e22\u0e01\u0e27\u0e48\u0e32 Astable multivibrator&nbsp;&nbsp;\u0e2a\u0e39\u0e15\u0e23\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2b\u0e32\u0e04\u0e27\u0e32\u0e21\u0e16\u0e35\u0e48\u0e08\u0e30\u0e21\u0e32\u0e08\u0e32\u0e01\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c 3 \u0e15\u0e31\u0e27\u0e01\u0e47\u0e04\u0e37\u0e2d R<sub>1<\/sub>&nbsp;, R<sub>2<\/sub>&nbsp;\u0e41\u0e25\u0e30 C&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07\u0e2a\u0e39\u0e15\u0e23\u0e01\u0e47\u0e07\u0e48\u0e32\u0e22\u0e21\u0e32\u0e01\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e25\u0e48\u0e32\u0e07<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">concept \u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e01\u0e47\u0e04\u0e37\u0e2d&nbsp;&nbsp;\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e08\u0e34\u0e49\u0e21 capacito r\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e27\u0e31\u0e14\u0e25\u0e07\u0e44\u0e1b&nbsp;&nbsp;\u0e15\u0e31\u0e27 IC 555 \u0e01\u0e47\u0e08\u0e30\u0e01\u0e33\u0e40\u0e19\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e16\u0e35\u0e48\u0e1b\u0e49\u0e2d\u0e19\u0e40\u0e02\u0e49\u0e32 GPIO (digital mode) \u0e02\u0e2d\u0e07 ESP32 \u0e41\u0e25\u0e30\u0e27\u0e31\u0e14\u0e04\u0e27\u0e32\u0e21\u0e16\u0e35\u0e48 + \u0e41\u0e1b\u0e25\u0e07\u0e44\u0e1b\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32 Capacitor \u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e08\u0e30\u0e27\u0e31\u0e14&nbsp;&nbsp;\u0e43\u0e19\u0e01\u0e32\u0e23 code \u0e43\u0e2b\u0e49\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32 capacitor \u0e27\u0e34\u0e18\u0e35\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e14\u0e35\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e43\u0e0a\u0e49\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e2d\u0e31\u0e19\u0e41\u0e21\u0e48\u0e19\u0e22\u0e33\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e02\u0e2d\u0e07 MCPWM \u0e42\u0e14\u0e22\u0e21\u0e31\u0e19\u0e08\u0e30\u0e27\u0e31\u0e14\u0e04\u0e32\u0e1a\u0e40\u0e27\u0e25\u0e32\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e02\u0e2d\u0e07\u0e02\u0e32\u0e02\u0e36\u0e49\u0e19 (Rising edge) \u0e02\u0e2d\u0e07\u0e04\u0e25\u0e37\u0e48\u0e19\u0e04\u0e27\u0e32\u0e21\u0e16\u0e35\u0e48\u0e17\u0e35\u0e48\u0e01\u0e33\u0e40\u0e19\u0e34\u0e14\u0e08\u0e32\u0e01 IC 555 \u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e41\u0e25\u0e30\u0e04\u0e33\u0e19\u0e27\u0e13\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e02\u0e2d\u0e07 capacitor \u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1b\u0e15\u0e32\u0e21\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/780\/091\/000\/mrvkpwl6oYlAVtwWU9q-o.png\" alt=\"\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e21\u0e35\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e35\u0e49<br>\u0e08\u0e32\u0e01\u0e20\u0e32\u0e1e\u0e19\u0e35\u0e49 \u0e43\u0e19\u0e27\u0e07\u0e08\u0e23\u0e2a\u0e48\u0e27\u0e19\u0e1a\u0e19\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e27\u0e07\u0e08\u0e23\u0e01\u0e33\u0e40\u0e19\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e16\u0e35\u0e48\u0e02\u0e2d\u0e07 IC 555 \u0e41\u0e25\u0e30\u0e2a\u0e31\u0e07\u0e40\u0e01\u0e15\u0e43\u0e19\u0e08\u0e2d\u0e20\u0e32\u0e1e\u0e01\u0e47\u0e08\u0e30\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e48\u0e32 Resistor , Capacitor<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/780\/091\/000\/mrvkg5bw14bcG03GcBTbpa-o.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e43\u0e19\u0e20\u0e32\u0e1e\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e2d\u0e32 capacitor \u0e02\u0e19\u0e32\u0e19\u0e01\u0e31\u0e19 2 \u0e15\u0e31\u0e27 (100 \u00b5F + 10 \u00b5F) \u0e01\u0e47\u0e08\u0e30\u0e2d\u0e48\u0e32\u0e19\u0e44\u0e14\u0e49\u0e04\u0e48\u0e32 capacitance \u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e47\u0e04\u0e37\u0e2d 111.5 \u00b5F &#8230;. \u0e41\u0e25\u0e30\u0e43\u0e0a\u0e49\u0e2a\u0e32\u0e22 jumper \u0e08\u0e34\u0e49\u0e21\u0e27\u0e31\u0e14 R 5.6k\u03a9 \u0e43\u0e19\u0e08\u0e2d\u0e20\u0e32\u0e1e\u0e01\u0e47\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e48\u0e32 5.59 k\u03a9<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/780\/091\/000\/mrvkg5clvcowD32t4WsZD-o.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Code \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Arduino.h>\n#include &lt;SPI.h>\n#include &lt;Wire.h>\n#include &lt;Adafruit_GFX.h>\n#include &lt;Adafruit_SH110X.h>\n#include \"driver\/mcpwm_cap.h\"\n\n\/\/ Hardware Pin Definitions\n#define CAP_INPUT_PIN   11   \/\/ Capacitance input (MCPWM)\n#define RES_ANALOG_PIN  1    \/\/ Resistance input (ADC1_CH0 \/ GPIO 1)\n#define I2C_SDA         40   \/\/ Shared OLED SDA\n#define I2C_SCL         42   \/\/ Shared OLED SCL\n#define SCREEN_ADDRESS  0x3C\n\n\/\/ OLED Display Setup\n#define SCREEN_WIDTH 128\n#define SCREEN_HEIGHT 64\nAdafruit_SH1106G display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, -1);\n\n\/\/ --- Capacitance Meter Constants &amp; Variables ---\nconst double TIMER_CONSTANT = 1.44 \/ 3000.0; \/\/ 555 Timer Astable Mode (R1=1000, R2=1000)\nconst uint32_t APB_CLOCK = 80000000;         \/\/ 80 MHz MCPWM clock source\n\nvolatile uint32_t last_capture_ticks = 0;\nvolatile uint32_t current_prescaler = 1;\nvolatile bool new_data_available = false;\nvolatile uint32_t last_interrupt_time = 0;\n\nmcpwm_cap_channel_handle_t cap_chan = NULL;\nmcpwm_cap_timer_handle_t cap_timer = NULL;\n\n\/\/ Global variables to store latest measurements\ndouble global_frequency = 0.0;\nbool cap_connected = false;\n\n\/\/ --- Resistance Meter Constants &amp; Variables ---\nunsigned long last_resistor_measure = 0;\nconst unsigned long resistor_interval = 500; \/\/ Measure resistance every 500ms\nfloat global_resistance = -1.0;              \/\/ -1.0 indicates \"OPEN\" or disconnected\n\n\/\/ Forward Declarations\nString formatWithDigits(long value);\nvoid set_capture_prescaler(uint32_t prescale_val);\n\n\/\/ --- Capacitance MCPWM ISR Callback ---\nstatic bool IRAM_ATTR on_capture_callback(mcpwm_cap_channel_handle_t cap_chan, const mcpwm_capture_event_data_t *edata, void *user_data) {\n    static uint32_t last_trigger_count = 0;\n    static uint32_t pulse_counter = 0;\n   \n    uint32_t current_count = edata->cap_value;\n    pulse_counter++;\n   \n    if (pulse_counter >= current_prescaler) {\n        last_capture_ticks = current_count - last_trigger_count;\n        last_trigger_count = current_count;\n        pulse_counter = 0;\n        \n        last_interrupt_time = millis();\n        new_data_available = true;\n    }\n    return false;\n}\n\nvoid set_capture_prescaler(uint32_t prescale_val) {\n    current_prescaler = prescale_val;\n}\n\nvoid setup() {\n    Serial.begin(115200);\n\n    \/\/ 1. Initialize shared I2C bus for the OLED display\n    Wire.begin(I2C_SDA, I2C_SCL);\n    if(!display.begin(SCREEN_ADDRESS, true)) {\n        Serial.println(F(\"SH1106 allocation failed\"));\n        for(;;);\n    }\n   \n    display.clearDisplay();\n    display.setTextColor(SH110X_WHITE);\n    display.setTextSize(1);\n    display.setCursor(0, 0);\n    display.println(\"Initializing Combo...\");\n    display.display();\n\n    \/\/ 2. Configure Resistance ADC Input\n    analogReadResolution(12); \/\/ 0-4095\n    analogSetPinAttenuation(RES_ANALOG_PIN, ADC_11db); \/\/ ~0V to 3.1V - 3.3V\n\n    \/\/ 3. Initialize Capacitance MCPWM Capture Timer\n    mcpwm_capture_timer_config_t timer_config = {};\n    timer_config.group_id = 0;\n    timer_config.clk_src = MCPWM_CAPTURE_CLK_SRC_DEFAULT;\n    ESP_ERROR_CHECK(mcpwm_new_capture_timer(&amp;timer_config, &amp;cap_timer));\n\n    \/\/ 4. Initialize Capacitance MCPWM Capture Channel\n    mcpwm_capture_channel_config_t cap_chan_config = {};\n    cap_chan_config.gpio_num = CAP_INPUT_PIN;\n    cap_chan_config.prescale = 1;\n    cap_chan_config.flags.neg_edge = 0;\n    cap_chan_config.flags.pos_edge = 1;\n    cap_chan_config.flags.pull_up = 0;\n    cap_chan_config.flags.pull_down = 0;\n    ESP_ERROR_CHECK(mcpwm_new_capture_channel(cap_timer, &amp;cap_chan_config, &amp;cap_chan));\n\n    \/\/ 5. Register Capacitance ISR Callback\n    mcpwm_capture_event_callbacks_t cbs = {};\n    cbs.on_cap = on_capture_callback;\n    ESP_ERROR_CHECK(mcpwm_capture_channel_register_event_callbacks(cap_chan, &amp;cbs, NULL));\n\n    \/\/ 6. Enable and Start Capacitance Hardware Peripherals\n    ESP_ERROR_CHECK(mcpwm_capture_channel_enable(cap_chan));\n    ESP_ERROR_CHECK(mcpwm_capture_timer_enable(cap_timer));\n    ESP_ERROR_CHECK(mcpwm_capture_timer_start(cap_timer));\n\n    last_interrupt_time = millis();\n}\n\nvoid loop() {\n    unsigned long currentMillis = millis();\n\n    \/\/ ==========================================\n    \/\/ 1. RESISTANCE MEASUREMENT LOGIC (Every 500ms)\n    \/\/ ==========================================\n    if (currentMillis - last_resistor_measure >= resistor_interval) {\n        last_resistor_measure = currentMillis;\n        \n        int rawADC = analogRead(RES_ANALOG_PIN);\n        if (rawADC &lt;= 10) {\n            global_resistance = -1.0; \/\/ Mark as OPEN circuit\n        } else {\n            float vGpio1 = (rawADC * 3.3f) \/ 4095.0f;\n            float resistance = (73480.0f \/ vGpio1) - 22000.0f;\n            if (resistance &lt; 0.0f) resistance = 0.0f;\n            global_resistance = resistance;\n        }\n    }\n\n    \/\/ ==========================================\n    \/\/ 2. CAPACITANCE MEASUREMENT LOGIC (Asynchronous)\n    \/\/ ==========================================\n    \/\/ Check if pulse stream stopped (Timeout after 2.5 seconds)\n    if (millis() - last_interrupt_time > 2500) {\n        cap_connected = false;\n        global_frequency = 0.0;\n        set_capture_prescaler(1);\n    }\n    \/\/ New pulse batch caught by ISR\n    else if (new_data_available) {\n        new_data_available = false;\n\n        noInterrupts();\n        uint32_t ticks = last_capture_ticks;\n        uint32_t active_prescaler = current_prescaler;\n        interrupts();\n\n        if (ticks > 0) {\n            global_frequency = ((double)APB_CLOCK * (double)active_prescaler) \/ (double)ticks;\n            \n            if (global_frequency > 600000.0) {\n                cap_connected = false;\n            } else {\n                cap_connected = true;\n            }\n\n            \/\/ Auto-Ranging Software Engine\n            if (ticks &lt; 250 &amp;&amp; active_prescaler == 1) {\n                set_capture_prescaler(16);\n            } else if (ticks > 50000 &amp;&amp; active_prescaler == 16) {\n                set_capture_prescaler(1);\n            }\n        }\n    }\n\n    \/\/ ==========================================\n    \/\/ 3. UNIFIED OLED DISPLAY UPDATE (Every 300ms)\n    \/\/ ==========================================\n    static uint32_t last_display_update = 0;\n    if (millis() - last_display_update > 300) {\n        last_display_update = millis();\n        \n        display.clearDisplay();\n        display.setTextColor(SH110X_WHITE);\n\n        \/\/ --- TOP HALF: RESISTANCE METER ---\n        display.setTextSize(1);\n        display.setCursor(0, 0);\n        display.print(\"RESISTANCE:\");\n        \n        display.setCursor(0, 10);\n        display.setTextSize(2);\n        if (global_resistance &lt; 0.0f) {\n            display.print(\"OPEN\");\n        } else if (global_resistance &lt; 1000.0f) {\n            display.print(formatWithDigits((long)global_resistance));\n            display.print(\" \");\n            display.print(\" Ohm\"); \/\/ If you just want it to say \"Ohm\" cleanly\n        } else {\n            float kOhm = global_resistance \/ 1000.0f;\n            display.print(kOhm, 2);\n            display.print(\" K\");\n            display.print(\"Ohm\"); \/\/ If you just want it to say \"Ohm\" cleanly\n        }\n\n        \/\/ Dividers visually separates the two regions\n        display.drawLine(0, 30, 128, 30, SH110X_WHITE);\n\n        \/\/ --- BOTTOM HALF: CAPACITANCE METER ---\n        display.setTextSize(1);\n        display.setCursor(0, 34);\n        display.print(\"CAPACITANCE:\");\n        \n        if (!cap_connected) {\n            display.setCursor(0, 46);\n            display.setTextSize(2);\n            display.print(\"OPEN\");\n        } else {\n            double capacitance_F = TIMER_CONSTANT \/ global_frequency;\n            double capacitance_uF = capacitance_F * 1000000.0;\n\n            display.setCursor(0, 46);\n            display.setTextSize(2);\n            if (capacitance_uF &lt; 0.1) {\n                display.print(capacitance_uF, 4);\n            } else if (capacitance_uF &lt; 10.0) {\n                display.print(capacitance_uF, 3);\n            } else {\n                display.print(capacitance_uF, 1);\n            }\n            display.setTextSize(1);\n            display.print(\" uF\");\n        }\n\n        display.display();\n    }\n}\n\n\/\/ Helper function to handle digit grouping (e.g., 22,000 instead of 22000)\nString formatWithDigits(long value) {\n    String valStr = String(value);\n    String result = \"\";\n    int len = valStr.length();\n   \n    for (int i = 0; i &lt; len; i++) {\n        if (i > 0 &amp;&amp; (len - i) % 3 == 0) {\n            result += \",\";\n        }\n        result += valStr&#91;i];\n    }\n    return result;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 ESP32 \u0e17\u0e33\u0e40\u0e1b\u0e47\u0e19 RC meter &#8230;. \u0e02\u0e2d\u0e40\u0e23\u0e34\u0e48\u0e21\u0e17\u0e35\u0e48\u0e01\u0e32\u0e23\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e01\u0e48\u0e2d\u0e19\u00a0\u00a0 \u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19\u0e17\u0e35\u0e48\u0e07\u0e48\u0e32\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e30\u0e44\u0e14\u0e49\u0e1c\u0e25\u0e14\u0e35\u0e21\u0e32\u0e01\u0e1e\u0e2d\u0e2a\u0e21\u0e04\u0e27\u0e23\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e15\u0e31\u0e27\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 (Voltage divider)\u00a0\u00a0\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e19\u0e31\u0e49\u0e19\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e27\u0e07\u0e08\u0e23\u0e41\u0e25\u0e30\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1b\u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u00a0\u00a0 \u0e2a\u0e21\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e22\u0e32\u0e01\u0e40\u0e25\u0e22\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\u0e21\u0e31\u0e19\u0e01\u0e47\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e0e\u0e02\u0e2d\u0e07\u0e42\u0e2d\u0e2b\u0e4c\u0e21\u0e18\u0e23\u0e23\u0e21\u0e14\u0e32\u0e19\u0e35\u0e48\u0e40\u0e2d\u0e07\u0e04\u0e23\u0e31\u0e1a&nbsp;&nbsp;\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e22\u0e38\u0e01\u0e15\u0e4c\u0e43\u0e0a\u0e49\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e44\u0e14\u0e49\u0e01\u0e47\u0e04\u0e37\u0e2d&nbsp;&nbsp;\u0e15\u0e48\u0e2d Vout&nbsp;\u0e02\u0e2d\u0e07\u0e27\u0e07\u0e08\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e01\u0e31\u0e1a GPIO \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19&nbsp;&nbsp;\u0e42\u0e14\u0e22\u0e21\u0e35\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 Vin&nbsp;\u0e19\u0e33\u0e21\u0e32\u0e08\u0e32\u0e01\u0e44\u0e1f 3.3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e02\u0e2d\u0e07 ESP32 \u0e40\u0e2d\u0e07&nbsp;&nbsp;\u0e41\u0e25\u0e30 Vout&nbsp;\u0e01\u0e47\u0e15\u0e48\u0e2d\u0e15\u0e23\u0e07\u0e01\u0e31\u0e1a GPIO \u0e02\u0e2d\u0e07 ESP32 \u0e43\u0e19 ADC mode &nbsp;&nbsp;\u0e43\u0e19\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49&nbsp;&nbsp;\u0e15\u0e31\u0e27\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e08\u0e30\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e15\u0e31\u0e27 R1&nbsp;&#8230;.. \u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27 R2&nbsp;\u0e08\u0e30\u0e43\u0e0a\u0e49 R \u0e04\u0e48\u0e32\u0e04\u0e07\u0e17\u0e35\u0e48&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07\u0e08\u0e32\u0e01\u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 input \u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07 3.3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e04\u0e48\u0e32\u0e02\u0e2d\u0e07 R2&nbsp;\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e01\u0e47\u0e04\u0e37\u0e2d 22k\u03a9 &#8230;. \u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19\u0e01\u0e32\u0e23\u0e2b\u0e32\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e2a\u0e48\u0e43\u0e19 code \u0e40\u0e23\u0e32\u0e01\u0e47\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e22\u0e49\u0e32\u0e22\u0e02\u0e49\u0e32\u0e07\u0e2a\u0e21\u0e01\u0e32\u0e23 \u0e42\u0e14\u0e22\u0e43\u0e19\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e41\u0e17\u0e19\u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19 Vin&nbsp;= 3.3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e41\u0e25\u0e30\u0e04\u0e48\u0e32\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e1a 22k\u03a9&nbsp;&nbsp;\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e41\u0e25\u0e49\u0e27\u0e08\u0e30\u0e44\u0e14\u0e49\u0e2a\u0e21\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e08\u0e30\u0e19\u0e33\u0e44\u0e1b\u0e43\u0e2a\u0e48\u0e43\u0e19 code \u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49 \u0e2a\u0e48\u0e27\u0e19\u0e01\u0e32\u0e23\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32 Capacitor \u0e27\u0e34\u0e18\u0e35\u0e17\u0e35\u0e48\u0e07\u0e48\u0e32\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e15\u0e48\u0e2d\u0e27\u0e07\u0e08\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e14\u0e22\u0e43\u0e0a\u0e49 IC 555 timer &hellip; <a href=\"https:\/\/navy007.com\/WP\/archives\/359\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;ESP32 (EP.7) ESP32 \u0e17\u0e33\u0e40\u0e1b\u0e47\u0e19 RC meter&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[260,3],"tags":[274,273,275],"class_list":["post-359","post","type-post","status-publish","format-standard","hentry","category-arduino-esp32","category-3","tag-555-timer","tag-astable-multivibrator","tag-voltage-divider"],"_links":{"self":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts\/359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/comments?post=359"}],"version-history":[{"count":1,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts\/359\/revisions"}],"predecessor-version":[{"id":360,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts\/359\/revisions\/360"}],"wp:attachment":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/media?parent=359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/categories?post=359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/tags?post=359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}