ESPHome 2025.5.0
Loading...
Searching...
No Matches
waveshare_epaper.h
Go to the documentation of this file.
1#pragma once
2
6
7namespace esphome {
8namespace waveshare_epaper {
9
11 public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
12 spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_2MHZ> {
13 public:
14 void set_dc_pin(GPIOPin *dc_pin) { dc_pin_ = dc_pin; }
15 float get_setup_priority() const override;
17 void set_busy_pin(GPIOPin *busy) { this->busy_pin_ = busy; }
18 void set_reset_duration(uint32_t reset_duration) { this->reset_duration_ = reset_duration; }
19
20 void command(uint8_t value);
21 void data(uint8_t value);
22 void cmd_data(const uint8_t *data, size_t length);
23
24 virtual void display() = 0;
25 virtual void initialize() = 0;
26 virtual void deep_sleep() = 0;
27
28 void update() override;
29
30 void setup() override;
31
32 void on_safe_shutdown() override;
33
34 protected:
35 bool wait_until_idle_();
36
37 void setup_pins_();
38
39 void reset_() {
40 if (this->reset_pin_ != nullptr) {
41 this->reset_pin_->digital_write(false);
42 delay(reset_duration_); // NOLINT
43 this->reset_pin_->digital_write(true);
44 delay(20);
45 }
46 }
47
48 virtual int get_width_controller() { return this->get_width_internal(); };
49
50 virtual uint32_t get_buffer_length_() = 0; // NOLINT(readability-identifier-naming)
51 uint32_t reset_duration_{200};
52
53 void start_command_();
54 void end_command_();
55 void start_data_();
56 void end_data_();
57
60 GPIOPin *busy_pin_{nullptr};
61 virtual uint32_t idle_timeout_() { return 1000u; } // NOLINT(readability-identifier-naming)
62};
63
65 public:
66 void fill(Color color) override;
67
69
70 protected:
71 void draw_absolute_pixel_internal(int x, int y, Color color) override;
72 uint32_t get_buffer_length_() override;
73};
74
76 public:
77 void fill(Color color) override;
78
80
81 protected:
82 void draw_absolute_pixel_internal(int x, int y, Color color) override;
83 uint32_t get_buffer_length_() override;
84};
85
87 public:
88 uint8_t color_to_hex(Color color);
89 void fill(Color color) override;
90
92
93 protected:
94 void draw_absolute_pixel_internal(int x, int y, Color color) override;
95 uint32_t get_buffer_length_() override;
96 void setup() override;
97
98 void init_internal_7c_(uint32_t buffer_length);
99 void send_buffers_();
100 void reset_();
101
102 static const int NUM_BUFFERS = 10;
104};
105
118
120 public:
122
123 void initialize() override;
124
125 void dump_config() override;
126
127 void display() override;
128
129 void deep_sleep() override {
130 switch (this->model_) {
131 // Models with specific deep sleep command and data
136 // COMMAND DEEP SLEEP MODE
137 this->command(0x10);
138 this->data(0x01);
139 break;
140 // Other models default to simple deep sleep command
141 default:
142 // COMMAND DEEP SLEEP
143 this->command(0x10);
144 break;
145 }
146 if (this->model_ != WAVESHARE_EPAPER_2_13_IN_V2) {
147 // From panel specification:
148 // "After this command initiated, the chip will enter Deep Sleep Mode, BUSY pad will keep output high."
149 this->wait_until_idle_();
150 }
151 }
152
153 void set_full_update_every(uint32_t full_update_every);
154
155 protected:
156 void write_lut_(const uint8_t *lut, uint8_t size);
157
158 void init_display_();
159
160 int get_width_internal() override;
161
162 int get_height_internal() override;
163
164 int get_width_controller() override;
165
166 uint32_t full_update_every_{30};
167 uint32_t at_update_{0};
169 uint32_t idle_timeout_() override;
170
172};
173
186
188 public:
189 void initialize() override;
190
191 void display() override;
192
193 void dump_config() override;
194
195 void deep_sleep() override {
196 this->command(0x10);
197 this->data(0x01);
198 }
199
200 protected:
201 int get_width_internal() override;
202 int get_height_internal() override;
203};
204
206 public:
207 void initialize() override;
208
209 void display() override;
210
211 void dump_config() override;
212
213 void deep_sleep() override {
214 // COMMAND DEEP SLEEP
215 this->command(0x07);
216 this->data(0xA5); // check byte
217 }
218
219 protected:
220 int get_width_internal() override;
221 int get_height_internal() override;
222};
223
225 public:
226 void initialize() override;
227
228 void display() override;
229
230 void dump_config() override;
231
232 void deep_sleep() override {
233 // COMMAND VCOM_AND_DATA_INTERVAL_SETTING
234 this->command(0x50);
235 // COMMAND POWER OFF
236 this->command(0x02);
237 this->wait_until_idle_();
238 // COMMAND DEEP SLEEP
239 this->command(0x07); // deep sleep
240 this->data(0xA5); // check byte
241 }
242
243 protected:
244 int get_width_internal() override;
245 int get_height_internal() override;
246};
247
249 public:
250 void initialize() override;
251
252 void display() override;
253
254 void dump_config() override;
255
256 void deep_sleep() override {
257 // COMMAND DEEP SLEEP
258 this->command(0x10);
259 this->data(0x01);
260 }
261
262 protected:
263 int get_width_internal() override;
264 int get_height_internal() override;
265};
266
268 public:
269 void initialize() override;
270
271 void display() override;
272
273 void dump_config() override;
274
275 void deep_sleep() override;
276 void set_full_update_every(uint32_t full_update_every);
277
278 protected:
279 void init_display_();
280 void init_full_();
281 void init_partial_();
282 void write_lut_(const uint8_t *lut, uint8_t size);
283 void power_off_();
284 void power_on_();
285 int get_width_internal() override;
286
287 int get_height_internal() override;
288
289 private:
290 uint32_t full_update_every_{30};
291 uint32_t at_update_{0};
292 bool deep_sleep_between_updates_{false};
293 bool power_is_on_{false};
294 bool is_deep_sleep_{false};
295 uint8_t *old_buffer_{nullptr};
296};
297
299 public:
300 void initialize() override;
301
302 void display() override;
303
304 void dump_config() override;
305
306 void deep_sleep() override {
307 this->command(0x10); // Enter deep sleep
308 this->data(0x01);
309 }
310
311 protected:
312 int get_width_internal() override;
313
314 int get_height_internal() override;
315};
316
318 public:
319 void initialize() override;
320
321 void display() override;
322
323 void dump_config() override;
324
325 void deep_sleep() override { ; }
326
327 protected:
328 int get_width_internal() override;
329
330 int get_height_internal() override;
331};
332
334 public:
335 void initialize() override;
336 void display() override;
337 void dump_config() override;
338 void deep_sleep() override;
339
340 protected:
341 int get_width_internal() override;
342 int get_height_internal() override;
343
344 private:
345 static const uint8_t CMD_DTM1_DATA_START_TRANS = 0x10;
346 static const uint8_t CMD_DTM2_DATA_START_TRANS2 = 0x13;
347 static const uint8_t CMD_DISPLAY_REFRESH = 0x12;
348 static const uint8_t CMD_AUTO_SEQ = 0x17;
349 static const uint8_t DATA_AUTO_PON_DSR_POF_DSLP = 0xA7;
350 static const uint8_t CMD_PSR_PANEL_SETTING = 0x00;
351 static const uint8_t CMD_UNDOCUMENTED_0x4D = 0x4D; // NOLINT
352 static const uint8_t CMD_UNDOCUMENTED_0xAA = 0xaa; // NOLINT
353 static const uint8_t CMD_UNDOCUMENTED_0xE9 = 0xe9; // NOLINT
354 static const uint8_t CMD_UNDOCUMENTED_0xB6 = 0xb6; // NOLINT
355 static const uint8_t CMD_UNDOCUMENTED_0xF3 = 0xf3; // NOLINT
356 static const uint8_t CMD_TRES_RESOLUTION_SETTING = 0x61;
357 static const uint8_t CMD_TCON_TCONSETTING = 0x60;
358 static const uint8_t CMD_CDI_VCOM_DATA_INTERVAL = 0x50;
359 static const uint8_t CMD_POF_POWER_OFF = 0x02;
360 static const uint8_t CMD_DSLP_DEEP_SLEEP = 0x07;
361 static const uint8_t DATA_DSLP_DEEP_SLEEP = 0xA5;
362 static const uint8_t CMD_PWS_POWER_SAVING = 0xe3;
363 static const uint8_t CMD_PON_POWER_ON = 0x04;
364 static const uint8_t CMD_PTL_PARTIAL_WINDOW = 0x90;
365
366 uint8_t *lastbuff_ = nullptr;
367 void reset_();
368 void clear_();
369 void write_init_list_(const uint8_t *list);
370 void init_internal_();
371};
372
374 public:
375 void initialize() override;
376
377 void display() override;
378
379 void dump_config() override;
380
381 void deep_sleep() override {
382 // COMMAND DEEP SLEEP
383 this->command(0x07);
384 this->data(0xA5); // check byte
385 }
386
387 protected:
388 int get_width_internal() override;
389
390 int get_height_internal() override;
391};
392
394 public:
395 void initialize() override;
396
397 void display() override;
398
399 void dump_config() override;
400
401 void deep_sleep() override {
402 // COMMAND DEEP SLEEP
403 this->command(0x07);
404 this->data(0xA5); // check byte
405 }
406
407 protected:
408 int get_width_internal() override;
409
410 int get_height_internal() override;
411};
412
414 public:
416
417 void initialize() override;
418
419 void display() override;
420
421 void dump_config() override;
422
423 void deep_sleep() override;
424
425 void set_full_update_every(uint32_t full_update_every);
426
427 protected:
428 void write_lut_(const uint8_t *lut, uint8_t size);
429
430 int get_width_internal() override;
431
432 int get_height_internal() override;
433
434 int get_width_controller() override;
435
436 uint32_t full_update_every_{30};
437 uint32_t at_update_{0};
438
439 private:
440 void reset_();
441};
442
444 public:
445 void initialize() override;
446
447 void display() override;
448
449 void dump_config() override;
450
451 void deep_sleep() override {
452 // COMMAND DEEP SLEEP
453 this->command(0x10);
454 this->data(0x01);
455 }
456
457 void set_full_update_every(uint32_t full_update_every);
458
459 protected:
460 uint32_t full_update_every_{30};
461 uint32_t at_update_{0};
462 int get_width_internal() override;
463
464 int get_height_internal() override;
465};
466
468 public:
469 void initialize() override;
470
471 void display() override;
472
473 void dump_config() override;
474
475 void deep_sleep() override {
476 // COMMAND DEEP SLEEP
477 this->command(0x07);
478 this->data(0xA5);
479 }
480
481 protected:
482 int get_width_internal() override;
483
484 int get_height_internal() override;
485};
486
488 public:
489 GDEY042T81();
490
491 void initialize() override;
492
493 void display() override;
494
495 void dump_config() override;
496
497 void deep_sleep() override {
498 // COMMAND POWER OFF
499 this->command(0x22);
500 this->data(0x83);
501 this->command(0x20);
502 // COMMAND DEEP SLEEP
503 this->command(0x10);
504 this->data(0x01);
505 }
506
507 void set_full_update_every(uint32_t full_update_every);
508
509 protected:
510 uint32_t full_update_every_{30};
511 uint32_t at_update_{0};
512
513 int get_width_internal() override;
514 int get_height_internal() override;
515 uint32_t idle_timeout_() override;
516
517 private:
518 void reset_();
519 void update_full_();
520 void update_part_();
521 void init_display_();
522};
523
525 public:
526 void initialize() override;
527
528 void display() override;
529
530 void dump_config() override;
531
532 void deep_sleep() override {
533 // COMMAND VCOM AND DATA INTERVAL SETTING
534 this->command(0x50);
535 this->data(0x17); // border floating
536
537 // COMMAND VCM DC SETTING
538 this->command(0x82);
539 // COMMAND PANEL SETTING
540 this->command(0x00);
541
542 delay(100); // NOLINT
543
544 // COMMAND POWER SETTING
545 this->command(0x01);
546 this->data(0x00);
547 this->data(0x00);
548 this->data(0x00);
549 this->data(0x00);
550 this->data(0x00);
551 delay(100); // NOLINT
552
553 // COMMAND POWER OFF
554 this->command(0x02);
555 this->wait_until_idle_();
556 // COMMAND DEEP SLEEP
557 this->command(0x07);
558 this->data(0xA5); // check byte
559 }
560
561 protected:
562 int get_width_internal() override;
563
564 int get_height_internal() override;
565};
566
568 public:
569 void initialize() override;
570
571 void display() override;
572
573 void dump_config() override;
574
575 void deep_sleep() override {
576 // COMMAND VCOM AND DATA INTERVAL SETTING
577 this->command(0x50);
578 this->data(0xF7); // border floating
579
580 // COMMAND POWER OFF
581 this->command(0x02);
582 this->wait_until_idle_();
583
584 // COMMAND DEEP SLEEP
585 this->command(0x07);
586 this->data(0xA5); // check code
587 }
588
589 protected:
590 int get_width_internal() override;
591
592 int get_height_internal() override;
593};
594
596 public:
597 void initialize() override;
598
599 void display() override;
600
601 void dump_config() override;
602
603 void deep_sleep() override {
604 // COMMAND VCOM AND DATA INTERVAL SETTING
605 this->command(0x50);
606 this->data(0xF7); // border floating
607
608 // COMMAND POWER OFF
609 this->command(0x02);
610 this->wait_until_idle_();
611
612 // COMMAND DEEP SLEEP
613 this->command(0x07);
614 this->data(0xA5); // check code
615 }
616
617 protected:
618 int get_width_internal() override;
619
620 int get_height_internal() override;
621};
622
624 public:
625 void initialize() override;
626
627 void display() override;
628
629 void dump_config() override;
630
631 void deep_sleep() override {
632 // COMMAND POWER OFF
633 this->command(0x02);
634 this->wait_until_idle_();
635 // COMMAND DEEP SLEEP
636 this->command(0x07);
637 this->data(0xA5); // check byte
638 }
639
640 protected:
641 int get_width_internal() override;
642
643 int get_height_internal() override;
644};
645
647 public:
648 void initialize() override;
649
650 void display() override;
651
652 void dump_config() override;
653
654 void deep_sleep() override {
655 // COMMAND VCOM AND DATA INTERVAL SETTING
656 this->command(0x50);
657 this->data(0x17); // border floating
658
659 // COMMAND VCM DC SETTING
660 this->command(0x82);
661 // COMMAND PANEL SETTING
662 this->command(0x00);
663
664 delay(100); // NOLINT
665
666 // COMMAND POWER SETTING
667 this->command(0x01);
668 this->data(0x00);
669 this->data(0x00);
670 this->data(0x00);
671 this->data(0x00);
672 this->data(0x00);
673 delay(100); // NOLINT
674
675 // COMMAND POWER OFF
676 this->command(0x02);
677 this->wait_until_idle_();
678 // COMMAND DEEP SLEEP
679 this->command(0x07);
680 this->data(0xA5); // check byte
681 }
682
683 protected:
684 int get_width_internal() override;
685
686 int get_height_internal() override;
687};
688
690 public:
691 void initialize() override;
692
693 void display() override;
694
695 void dump_config() override;
696
697 void deep_sleep() override;
698
699 void set_full_update_every(uint32_t full_update_every);
700
701 protected:
702 int get_width_internal() override;
703 int get_height_internal() override;
704 uint32_t idle_timeout_() override;
705
706 private:
707 void power_on_();
708 void power_off_();
709 void reset_();
710 void update_full_();
711 void update_part_();
712 void init_full_();
713 void init_partial_();
714 void init_display_();
715
716 uint32_t full_update_every_{30};
717 uint32_t at_update_{0};
718 bool power_is_on_{false};
719 bool is_deep_sleep_{false};
720 uint8_t *old_buffer_{nullptr};
721};
722
724 public:
725 void initialize() override;
726
727 void display() override;
728
729 void dump_config() override;
730
731 protected:
732 int get_width_internal() override;
733
734 int get_height_internal() override;
735
736 uint32_t idle_timeout_() override;
737
738 void deep_sleep() override { ; }
739
740 enum WaitForState { BUSY = true, IDLE = false };
742
744};
745
747 public:
748 void initialize() override;
749
750 void display() override;
751
752 void dump_config() override;
753
754 protected:
755 int get_width_internal() override;
756
757 int get_height_internal() override;
758
759 uint32_t idle_timeout_() override;
760
761 void deep_sleep() override { ; }
762
763 bool wait_until_idle_();
764
766};
767
769 public:
770 void initialize() override;
771
772 void display() override;
773
774 void dump_config() override;
775
776 void deep_sleep() override {
777 // COMMAND POWER OFF
778 this->command(0x02);
779 this->wait_until_idle_();
780 // COMMAND DEEP SLEEP
781 this->command(0x07);
782 this->data(0xA5); // check byte
783 }
784
785 protected:
786 int get_width_internal() override;
787
788 int get_height_internal() override;
789};
790
792 public:
793 void initialize() override;
794
795 void display() override;
796
797 void dump_config() override;
798
799 void deep_sleep() override {
800 // COMMAND POWER OFF
801 this->command(0x02);
802 this->wait_until_idle_();
803 // COMMAND DEEP SLEEP
804 this->command(0x07); // deep sleep
805 this->data(0xA5); // check byte
806 }
807
808 protected:
809 int get_width_internal() override;
810
811 int get_height_internal() override;
812};
813
815 public:
816 bool wait_until_idle_();
817
818 void initialize() override;
819
820 void display() override;
821
822 void dump_config() override;
823
824 void deep_sleep() override {
825 this->command(0x02); // Power off
826 this->wait_until_idle_();
827 this->command(0x07); // Deep sleep
828 this->data(0xA5);
829 }
830
832
833 protected:
834 int get_width_internal() override;
835
836 int get_height_internal() override;
837
838 void reset_() {
839 if (this->reset_pin_ != nullptr) {
840 this->reset_pin_->digital_write(true);
841 delay(200); // NOLINT
842 this->reset_pin_->digital_write(false);
843 delay(5);
844 this->reset_pin_->digital_write(true);
845 delay(200); // NOLINT
846 }
847 };
848
849 void init_display_();
850};
851
853 public:
854 bool wait_until_idle_();
855
856 void initialize() override;
857
858 void display() override;
859
860 void dump_config() override;
861
862 void deep_sleep() override {
863 this->command(0x02); // Power off
864 this->wait_until_idle_();
865 this->command(0x07); // Deep sleep
866 this->data(0xA5);
867 }
868
870
871 protected:
872 int get_width_internal() override;
873
874 int get_height_internal() override;
875
876 void reset_() {
877 if (this->reset_pin_ != nullptr) {
878 this->reset_pin_->digital_write(true);
879 delay(200); // NOLINT
880 this->reset_pin_->digital_write(false);
881 delay(5);
882 this->reset_pin_->digital_write(true);
883 delay(200); // NOLINT
884 }
885 };
886
887 void init_display_();
888};
889
891 public:
892 void initialize() override;
893
894 void display() override;
895
896 void dump_config() override;
897
898 void deep_sleep() override {
899 // COMMAND POWER OFF
900 this->command(0x02);
901 this->wait_until_idle_();
902 // COMMAND DEEP SLEEP
903 this->command(0x07);
904 this->data(0xA5); // check byte
905 }
906
907 protected:
908 int get_width_internal() override;
909
910 int get_height_internal() override;
911};
912
914 public:
915 bool wait_until_idle_();
916
917 void initialize() override;
918
919 void display() override;
920
921 void dump_config() override;
922
923 void deep_sleep() override {
924 // COMMAND POWER OFF
925 this->command(0x02);
926 this->wait_until_idle_();
927 // COMMAND DEEP SLEEP
928 this->command(0x07);
929 this->data(0xA5); // check byte
930 }
931
932 protected:
933 int get_width_internal() override;
934
935 int get_height_internal() override;
936
937 uint32_t idle_timeout_() override;
938};
939
941 public:
942 bool wait_until_idle_();
943 void initialize() override;
944 void dump_config() override;
945
946 protected:
947 void reset_() {
948 if (this->reset_pin_ != nullptr) {
949 this->reset_pin_->digital_write(true);
950 delay(200); // NOLINT
951 this->reset_pin_->digital_write(false);
952 delay(2);
953 this->reset_pin_->digital_write(true);
954 delay(20);
955 }
956 };
957};
958
960 public:
961 bool wait_until_idle_();
962
963 void initialize() override;
964
965 void display() override;
966
967 void dump_config() override;
968
969 void deep_sleep() override {
970 // COMMAND POWER OFF
971 this->command(0x02);
972 this->wait_until_idle_();
973 // COMMAND DEEP SLEEP
974 this->command(0x07);
975 this->data(0xA5); // check byte
976 }
977
978 void set_full_update_every(uint32_t full_update_every);
979
980 protected:
981 int get_width_internal() override;
982
983 int get_height_internal() override;
984
985 uint32_t idle_timeout_() override;
986
987 uint32_t full_update_every_{30};
988 uint32_t at_update_{0};
989
990 private:
991 void reset_();
992
993 void turn_on_display_();
994};
995
997 public:
998 void initialize() override;
999
1000 void display() override;
1001
1002 void dump_config() override;
1003
1004 void deep_sleep() override {
1005 // deep sleep
1006 this->command(0x10);
1007 this->data(0x01);
1008 }
1009
1010 protected:
1011 int get_width_internal() override;
1012
1013 int get_height_internal() override;
1014};
1015
1017 public:
1018 void initialize() override;
1019
1020 void display() override;
1021
1022 void dump_config() override;
1023
1024 void deep_sleep() override {
1025 // COMMAND POWER DOWN
1026 this->command(0x10);
1027 this->data(0x01);
1028 // cannot wait until idle here, the device no longer responds
1029 }
1030
1031 void set_full_update_every(uint32_t full_update_every);
1032
1033 protected:
1034 int get_width_internal() override;
1035
1036 int get_height_internal() override;
1037
1038 uint32_t idle_timeout_() override;
1039
1041 uint32_t at_update_{0};
1042};
1043
1045 public:
1046 void display() override;
1047
1048 void dump_config() override;
1049
1050 void deep_sleep() override {
1051 // COMMAND POWER DOWN
1052 this->command(0x10);
1053 this->data(0x01);
1054 // cannot wait until idle here, the device no longer responds
1055 }
1056
1057 void set_full_update_every(uint32_t full_update_every);
1058
1059 void setup() override;
1060 void initialize() override;
1061
1062 protected:
1063 int get_width_controller() override;
1064 int get_width_internal() override;
1065 int get_height_internal() override;
1066 uint32_t idle_timeout_() override;
1067
1068 void write_buffer_(uint8_t cmd, int top, int bottom);
1069 void set_window_(int t, int b);
1070 void send_reset_();
1071 void partial_update_();
1072 void full_update_();
1073
1075 uint32_t at_update_{0};
1076 bool is_busy_{false};
1077 void write_lut_(const uint8_t *lut);
1078};
1079
1081 public:
1082 void initialize() override;
1083
1084 void display() override;
1085
1086 void dump_config() override;
1087
1088 void deep_sleep() override {
1089 // COMMAND DEEP SLEEP
1090 this->command(0x10);
1091 this->data(0x01);
1092 }
1093
1094 protected:
1095 int get_width_internal() override;
1096
1097 int get_height_internal() override;
1098
1099 uint32_t idle_timeout_() override;
1100};
1101
1102} // namespace waveshare_epaper
1103} // namespace esphome
virtual void digital_write(bool value)=0
virtual int get_width_internal()=0
The SPIDevice is what components using the SPI will create.
Definition spi.h:421
void set_full_update_every(uint32_t full_update_every)
void write_lut_(const uint8_t *lut, uint8_t size)
void set_full_update_every(uint32_t full_update_every)
void set_full_update_every(uint32_t full_update_every)
void set_full_update_every(uint32_t full_update_every)
void write_buffer_(uint8_t cmd, int top, int bottom)
void write_lut_(const uint8_t *lut, uint8_t size)
void draw_absolute_pixel_internal(int x, int y, Color color) override
display::DisplayType get_display_type() override
void draw_absolute_pixel_internal(int x, int y, Color color) override
display::DisplayType get_display_type() override
void set_reset_duration(uint32_t reset_duration)
void cmd_data(const uint8_t *data, size_t length)
void draw_absolute_pixel_internal(int x, int y, Color color) override
display::DisplayType get_display_type() override
void set_full_update_every(uint32_t full_update_every)
WaveshareEPaperTypeA(WaveshareEPaperTypeAModel model)
void write_lut_(const uint8_t *lut, uint8_t size)
bool state
Definition fan.h:0
uint16_t reset
Definition ina226.h:5
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
void IRAM_ATTR HOT delay(uint32_t ms)
Definition core.cpp:28
uint16_t length
Definition tt21100.cpp:0
uint16_t x
Definition tt21100.cpp:5
uint16_t y
Definition tt21100.cpp:6