mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-07-28 12:17:05 +00:00
Compare commits
666
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca0a16fb9c | ||
|
|
6f895c2e2e | ||
|
|
8912ef845c | ||
|
|
1231c6a9c2 | ||
|
|
6313d4344d | ||
|
|
6dcfc9e2a1 | ||
|
|
2e9e1e480f | ||
|
|
d7dcd9cff0 | ||
|
|
bdf0e6e05c | ||
|
|
75e411f458 | ||
|
|
bc9a697792 | ||
|
|
dfe90363b7 | ||
|
|
d8dd25593e | ||
|
|
38d08d6902 | ||
|
|
a7b32273ae | ||
|
|
5ccbdfff11 | ||
|
|
4ff3de5482 | ||
|
|
d52435264d | ||
|
|
cd76c88860 | ||
|
|
429fa31ee5 | ||
|
|
6b33cee8ea | ||
|
|
a182ca8097 | ||
|
|
f7feeff9b4 | ||
|
|
a5cfa1713d | ||
|
|
04edfae8de | ||
|
|
1e9debf67c | ||
|
|
250d8aca59 | ||
|
|
19ec7a90cf | ||
|
|
74e591ac81 | ||
|
|
29fb32225a | ||
|
|
f90f97e3d0 | ||
|
|
fd634a12a1 | ||
|
|
19b59359e0 | ||
|
|
0fe9566d14 | ||
|
|
9e49f6f7b1 | ||
|
|
660377ea02 | ||
|
|
4e171993ff | ||
|
|
dfdaa831d5 | ||
|
|
946c1a8390 | ||
|
|
f7c7d176f1 | ||
|
|
0a72b711f9 | ||
|
|
2f8962ec52 | ||
|
|
b68d91fc58 | ||
|
|
a8c565ee5f | ||
|
|
6f06b57d14 | ||
|
|
cf949ab167 | ||
|
|
21cc1faf25 | ||
|
|
99030621b7 | ||
|
|
33199ceb12 | ||
|
|
6175adddd1 | ||
|
|
35461643ff | ||
|
|
9397f560dc | ||
|
|
6de76f8817 | ||
|
|
ae9deeb702 | ||
|
|
1bdbc97d33 | ||
|
|
bec97768f4 | ||
|
|
abdc9a0454 | ||
|
|
c9bb2750a3 | ||
|
|
eda3326615 | ||
|
|
d2644b2da7 | ||
|
|
8650bc6aa3 | ||
|
|
dee5f6df1a | ||
|
|
0085986701 | ||
|
|
7a72836d0f | ||
|
|
cec830fe83 | ||
|
|
894a59e10b | ||
|
|
e28f46697a | ||
|
|
14ced058b5 | ||
|
|
fabc514f8e | ||
|
|
4ae5e2ce7b | ||
|
|
0585d48ffa | ||
|
|
be9a5d622a | ||
|
|
821fcb9e54 | ||
|
|
1a9584134a | ||
|
|
d2e9337d76 | ||
|
|
6c5c12a6f2 | ||
|
|
9eb2ebe210 | ||
|
|
1d5fbd926e | ||
|
|
4d3ac95e5a | ||
|
|
1f1e47530a | ||
|
|
3b1d26b541 | ||
|
|
8a86ee9b89 | ||
|
|
ed592a3a0a | ||
|
|
f2b330424c | ||
|
|
542a758fde | ||
|
|
11e4addb41 | ||
|
|
8921ebbcaa | ||
|
|
d05d669284 | ||
|
|
71a6b344e7 | ||
|
|
c67becac0c | ||
|
|
0ec06161c5 | ||
|
|
a2b2cd857a | ||
|
|
0e581f0288 | ||
|
|
fffcd0f2a4 | ||
|
|
1d923a527f | ||
|
|
356ebbc875 | ||
|
|
25fadfc1ed | ||
|
|
54d892e162 | ||
|
|
007ef78f2b | ||
|
|
d16daeca56 | ||
|
|
90fdb8f809 | ||
|
|
383206b149 | ||
|
|
ac20349854 | ||
|
|
1a972d61a6 | ||
|
|
d6cf2e141b | ||
|
|
7a2e9ba203 | ||
|
|
e3591aceb2 | ||
|
|
ad3514e765 | ||
|
|
f543995d86 | ||
|
|
97ccb8eca1 | ||
|
|
f291c9d25a | ||
|
|
bd9ead3851 | ||
|
|
43ea0039fd | ||
|
|
74eb638bcb | ||
|
|
c87b035908 | ||
|
|
0f450eaa3d | ||
|
|
02df033fc6 | ||
|
|
74d05e58f0 | ||
|
|
3d88537677 | ||
|
|
95b0a7bed9 | ||
|
|
bc3434532e | ||
|
|
1f7639cb42 | ||
|
|
923642bb27 | ||
|
|
a09cb906eb | ||
|
|
72b0a32839 | ||
|
|
e279e5504b | ||
|
|
6d5ddf06ce | ||
|
|
7f544b7a10 | ||
|
|
fc407e86e1 | ||
|
|
a35c3051df | ||
|
|
f8f2ddd33b | ||
|
|
6592b57615 | ||
|
|
6e8e8214b2 | ||
|
|
24b6611c54 | ||
|
|
8135defa6f | ||
|
|
d5e9cfb081 | ||
|
|
ffc8e1fb97 | ||
|
|
0255f41897 | ||
|
|
e88973861f | ||
|
|
d6ec7aa736 | ||
|
|
8aa5866dd9 | ||
|
|
0c384c332e | ||
|
|
7a4f3b15b3 | ||
|
|
c38e532e67 | ||
|
|
f983dd924d | ||
|
|
f0ff52b76b | ||
|
|
3c0e5d1965 | ||
|
|
14489a2e98 | ||
|
|
a920b95cfb | ||
|
|
a111175a8f | ||
|
|
4fd2166b5e | ||
|
|
db76aeb959 | ||
|
|
b313957311 | ||
|
|
9d0f741e84 | ||
|
|
7c0f1551b8 | ||
|
|
8a59811392 | ||
|
|
e2e715d7de | ||
|
|
ccb4cf6a7a | ||
|
|
1b4a217bc9 | ||
|
|
19ecf36358 | ||
|
|
bdea34a583 | ||
|
|
b7b5028c0c | ||
|
|
c519d887db | ||
|
|
29c8b850ba | ||
|
|
d01cb9b9a2 | ||
|
|
9d894d7c83 | ||
|
|
a418cb2bd0 | ||
|
|
907a672fa0 | ||
|
|
2f10274da2 | ||
|
|
399b344779 | ||
|
|
2e06ed14c0 | ||
|
|
b0032bebdb | ||
|
|
a525ec34b0 | ||
|
|
024ec7b727 | ||
|
|
1ff0141e38 | ||
|
|
125db8046b | ||
|
|
720317c829 | ||
|
|
bbe9005a32 | ||
|
|
afa16e80b6 | ||
|
|
37f5c92aa7 | ||
|
|
684b89ae4c | ||
|
|
8c4612c300 | ||
|
|
0afab53659 | ||
|
|
e6e98345fe | ||
|
|
2394e4a75f | ||
|
|
e1c4691325 | ||
|
|
3f84c35014 | ||
|
|
bc0bafa96b | ||
|
|
4e7e66822d | ||
|
|
6f226e6d65 | ||
|
|
a50a035238 | ||
|
|
d560c635f5 | ||
|
|
f8db0c0a05 | ||
|
|
79616022df | ||
|
|
559d294607 | ||
|
|
d2588c5e01 | ||
|
|
ba45a51576 | ||
|
|
8321caaeed | ||
|
|
b35ed7d809 | ||
|
|
a4583d150e | ||
|
|
cadc0a885d | ||
|
|
061eb20ae5 | ||
|
|
9a9799eee7 | ||
|
|
f4615bb76b | ||
|
|
ecc498c359 | ||
|
|
e0e10fa6c8 | ||
|
|
228f09f394 | ||
|
|
19ac19778b | ||
|
|
5e2d517ba2 | ||
|
|
7a4b17983e | ||
|
|
6eba74ccc1 | ||
|
|
27a05b674c | ||
|
|
4a66bbf081 | ||
|
|
109bddb5c3 | ||
|
|
8158a919d8 | ||
|
|
706b91168b | ||
|
|
d047999c5e | ||
|
|
42f361aacd | ||
|
|
3dd076cf25 | ||
|
|
c0d155dd99 | ||
|
|
c433174d71 | ||
|
|
b805b59baf | ||
|
|
9fae0477d8 | ||
|
|
f7ac04dc96 | ||
|
|
d50e661efb | ||
|
|
57b5338af6 | ||
|
|
bd035c8f81 | ||
|
|
ac63d93e1a | ||
|
|
4cff0d0e02 | ||
|
|
ca83983fd2 | ||
|
|
d808f7e79b | ||
|
|
e469350ad9 | ||
|
|
60536b1a93 | ||
|
|
b9e45bd515 | ||
|
|
a0992b8383 | ||
|
|
9315581858 | ||
|
|
9a763303ca | ||
|
|
7df9379f47 | ||
|
|
c32fe50521 | ||
|
|
e4569b26f7 | ||
|
|
48998886fe | ||
|
|
36f97d7909 | ||
|
|
0e3b9c9e47 | ||
|
|
acecff4108 | ||
|
|
3322b954a7 | ||
|
|
4c4b844a4d | ||
|
|
cf4d28eb4f | ||
|
|
555b5386ae | ||
|
|
1903fdc7f2 | ||
|
|
918353461e | ||
|
|
e648a20fd0 | ||
|
|
1d7ea5e129 | ||
|
|
6ce5240dd7 | ||
|
|
692fb248ce | ||
|
|
5a87397ee0 | ||
|
|
99ba09b024 | ||
|
|
3dea091d21 | ||
|
|
ca13317cbd | ||
|
|
f68516d5bb | ||
|
|
8102a0096d | ||
|
|
73cec59bd5 | ||
|
|
96ecf9bf29 | ||
|
|
ef1e371514 | ||
|
|
45d67292a3 | ||
|
|
b5662baad4 | ||
|
|
12c3e5f81f | ||
|
|
dececf24ee | ||
|
|
3fb6dec382 | ||
|
|
cef962c5f1 | ||
|
|
cca2335070 | ||
|
|
ffd0d26ed3 | ||
|
|
9b457ed77b | ||
|
|
f787a9a9a6 | ||
|
|
a0ae104794 | ||
|
|
2b78810457 | ||
|
|
43081c3ac8 | ||
|
|
33281c08c2 | ||
|
|
461aee26ad | ||
|
|
2b0b14b2e8 | ||
|
|
b7404666b1 | ||
|
|
da25aa87dd | ||
|
|
10a1e634e2 | ||
|
|
83f86449b9 | ||
|
|
eee337d3e3 | ||
|
|
c549ecd329 | ||
|
|
d9e682668d | ||
|
|
e38072ac24 | ||
|
|
6aebeba5dc | ||
|
|
da01c8f469 | ||
|
|
d3c86b9824 | ||
|
|
9621a91d90 | ||
|
|
b3b68856f0 | ||
|
|
bec5cb5334 | ||
|
|
bda6011390 | ||
|
|
f3fdb93a52 | ||
|
|
200b060b15 | ||
|
|
ff41cb2f94 | ||
|
|
c134eb6d13 | ||
|
|
f9e2a211e1 | ||
|
|
bd3d3f66f4 | ||
|
|
3bad683211 | ||
|
|
68f6e913a2 | ||
|
|
0b9c550fd7 | ||
|
|
96420faa2f | ||
|
|
8eea77e4ed | ||
|
|
3d1f723787 | ||
|
|
5d459003e4 | ||
|
|
ad208c357c | ||
|
|
b1c777e6fd | ||
|
|
f5ab15c255 | ||
|
|
001ec6dcd2 | ||
|
|
15e5edccd8 | ||
|
|
651353cc99 | ||
|
|
85f97551c5 | ||
|
|
6a158f68f5 | ||
|
|
1933714de5 | ||
|
|
545117ddf7 | ||
|
|
8eb479c411 | ||
|
|
b39f51ca3c | ||
|
|
4511e08d3c | ||
|
|
086e836956 | ||
|
|
3e20f617ea | ||
|
|
8d9aacb6a4 | ||
|
|
0670fa98a6 | ||
|
|
2b3d1517c9 | ||
|
|
0be79759d1 | ||
|
|
d47bede215 | ||
|
|
2988a244b2 | ||
|
|
8d87dc0175 | ||
|
|
21c86e666a | ||
|
|
e6fdd3380a | ||
|
|
e04f71ab47 | ||
|
|
90ae0720cf | ||
|
|
4ec2af24a3 | ||
|
|
c8ecd8d374 | ||
|
|
7a451dd672 | ||
|
|
b06f6aa360 | ||
|
|
6b67415c71 | ||
|
|
b095465d3a | ||
|
|
81a5d911ba | ||
|
|
48060d8d99 | ||
|
|
d303fa023f | ||
|
|
29b0cc1b32 | ||
|
|
584abd1e75 | ||
|
|
b4d8be0e59 | ||
|
|
30f5c5cb7d | ||
|
|
6e7286c6fb | ||
|
|
ae1db543ce | ||
|
|
947e1e0343 | ||
|
|
0578d720f4 | ||
|
|
3fee6794f2 | ||
|
|
019e33331b | ||
|
|
211d79bbd5 | ||
|
|
8a751a0922 | ||
|
|
450eca8dc5 | ||
|
|
ce0bfbf717 | ||
|
|
bb316bbd30 | ||
|
|
91c5d60af9 | ||
|
|
0d9bc8027d | ||
|
|
bd2bdab95c | ||
|
|
c4f98fbc8e | ||
|
|
b332a513b5 | ||
|
|
e36bb714f1 | ||
|
|
6e1cde343f | ||
|
|
cce9ddd2dc | ||
|
|
51be17a436 | ||
|
|
66d27a6697 | ||
|
|
a033e458fb | ||
|
|
494436bbff | ||
|
|
23bacd0762 | ||
|
|
9bdfab3fa2 | ||
|
|
9d446745cc | ||
|
|
d2ab946d17 | ||
|
|
fcc71a56b6 | ||
|
|
f131254853 | ||
|
|
657d15d962 | ||
|
|
60910da48d | ||
|
|
6cee2d0f32 | ||
|
|
533cb88a64 | ||
|
|
ffa32fe851 | ||
|
|
b900cc9389 | ||
|
|
8e11c19af6 | ||
|
|
f33ca6df78 | ||
|
|
194a230d20 | ||
|
|
7a5a432016 | ||
|
|
07511fe144 | ||
|
|
9a390136f9 | ||
|
|
27a03f166a | ||
|
|
0a63aeb8f0 | ||
|
|
22c10ac615 | ||
|
|
ac83cfa249 | ||
|
|
6ef0c08bc4 | ||
|
|
1ee965067d | ||
|
|
e46a873fce | ||
|
|
784e956c96 | ||
|
|
b6eebb330a | ||
|
|
a4fe8d42d2 | ||
|
|
fa42cadfa1 | ||
|
|
17dc6fa859 | ||
|
|
1432726dec | ||
|
|
7ba6ffa407 | ||
|
|
ab555e4d6b | ||
|
|
d4259f4e23 | ||
|
|
aef45c06f6 | ||
|
|
828f9e6a30 | ||
|
|
e79d778cf4 | ||
|
|
965eb2d994 | ||
|
|
657fccf49f | ||
|
|
228b41a1ac | ||
|
|
3bba294eb7 | ||
|
|
0254181b3e | ||
|
|
3b67282abb | ||
|
|
38af765935 | ||
|
|
ff180b085c | ||
|
|
e0785eb796 | ||
|
|
75a83787a4 | ||
|
|
65bea6343c | ||
|
|
6fe61411a0 | ||
|
|
4552e91022 | ||
|
|
cc94d70e6c | ||
|
|
2435078f76 | ||
|
|
dd2cd50d4b | ||
|
|
fe38eb629d | ||
|
|
e961507456 | ||
|
|
e5ee5644bf | ||
|
|
ac6d85e214 | ||
|
|
39c2d54aee | ||
|
|
68efd5ff9e | ||
|
|
627f516f85 | ||
|
|
a45fadf42e | ||
|
|
2ae52b849c | ||
|
|
639685ea0d | ||
|
|
867209de6d | ||
|
|
1d8b6d346b | ||
|
|
2a5ac327d3 | ||
|
|
886101d4d4 | ||
|
|
8fc6486855 | ||
|
|
eeb1cc71b3 | ||
|
|
13837830e8 | ||
|
|
f86ff46a82 | ||
|
|
e901bc957a | ||
|
|
e7e10c5305 | ||
|
|
466ddfbe88 | ||
|
|
c8f02d2a4c | ||
|
|
af1d9b38c9 | ||
|
|
7294217489 | ||
|
|
208fa8a3aa | ||
|
|
b3b8eff127 | ||
|
|
c6a90ab2d0 | ||
|
|
e7d28e8576 | ||
|
|
efa27dc01d | ||
|
|
7c7b81911d | ||
|
|
c2962d7337 | ||
|
|
e2e2059ff0 | ||
|
|
4e95bbef7f | ||
|
|
b0a90b5b14 | ||
|
|
c8ac1bbd59 | ||
|
|
e6105bfe71 | ||
|
|
1bb8669ed2 | ||
|
|
34f4a9a8e0 | ||
|
|
a517f3471c | ||
|
|
9c706b7b0e | ||
|
|
f2b4e17e2a | ||
|
|
6f62ba0f9b | ||
|
|
36c6fd4bf7 | ||
|
|
4446d76c83 | ||
|
|
f354b05b07 | ||
|
|
467df9dde2 | ||
|
|
dac243cc82 | ||
|
|
3d1be96f8a | ||
|
|
0dd53e38d7 | ||
|
|
df6338dfee | ||
|
|
1bab99de40 | ||
|
|
ec44efb59f | ||
|
|
202a6fd1f7 | ||
|
|
dc7828d343 | ||
|
|
5c92731b41 | ||
|
|
8c34067d9c | ||
|
|
92025249fc | ||
|
|
dd5b5bb7c3 | ||
|
|
03bc2f34f6 | ||
|
|
a19b59e184 | ||
|
|
861bc64ce3 | ||
|
|
7428b03e18 | ||
|
|
54a6ecac7d | ||
|
|
ec4aa627bb | ||
|
|
0dc47bc04c | ||
|
|
5f029c59d2 | ||
|
|
8beeeaf7fa | ||
|
|
293b63e654 | ||
|
|
734150e87b | ||
|
|
6bb1b4086c | ||
|
|
9cd2d2d843 | ||
|
|
02c022d7d5 | ||
|
|
b1c8346700 | ||
|
|
272ed8c578 | ||
|
|
a9e473dbc6 | ||
|
|
4baccf5863 | ||
|
|
ad84eb8b8a | ||
|
|
23f2bfc6d8 | ||
|
|
34d2f25652 | ||
|
|
294683ece1 | ||
|
|
56bd1cb19c | ||
|
|
812f530c4b | ||
|
|
97258a531d | ||
|
|
7d2ef727a7 | ||
|
|
9e83213a13 | ||
|
|
ecb5ca9306 | ||
|
|
edb6178ae2 | ||
|
|
b8894efc57 | ||
|
|
970181d8c7 | ||
|
|
9d2fad783f | ||
|
|
9d42e83314 | ||
|
|
0005915c5c | ||
|
|
eb78bc3e03 | ||
|
|
17777698cd | ||
|
|
d091148dfc | ||
|
|
fcb25a2aec | ||
|
|
a7d90a33a0 | ||
|
|
3a68ff8f9d | ||
|
|
3b45e200a7 | ||
|
|
b724c22c80 | ||
|
|
b810e34b74 | ||
|
|
c70ffd735c | ||
|
|
604c58a290 | ||
|
|
1d1b69b1ce | ||
|
|
bd2cc4138b | ||
|
|
ca5f2815bc | ||
|
|
f67bf51606 | ||
|
|
e1f0badd92 | ||
|
|
b9ea66037c | ||
|
|
62a196d398 | ||
|
|
d4ee74297b | ||
|
|
d0d95e221b | ||
|
|
7ad8880651 | ||
|
|
f46a6c3414 | ||
|
|
ab0ed4b5ca | ||
|
|
b1fb308646 | ||
|
|
79ee397e8e | ||
|
|
56569374f3 | ||
|
|
41b13f6797 | ||
|
|
8f23048f18 | ||
|
|
a123dbf37f | ||
|
|
6b65e90ddf | ||
|
|
890db55197 | ||
|
|
514800433f | ||
|
|
deb18d2391 | ||
|
|
e18d069171 | ||
|
|
b63c375793 | ||
|
|
f906e9173c | ||
|
|
c444022f5f | ||
|
|
5511ee9f38 | ||
|
|
427a22d23b | ||
|
|
306cbf3107 | ||
|
|
458f672744 | ||
|
|
dee1ee6f32 | ||
|
|
8930e331d3 | ||
|
|
6033990767 | ||
|
|
d271898968 | ||
|
|
f261e6a5ea | ||
|
|
ff160f386e | ||
|
|
ef92e7ae4f | ||
|
|
4051f0bd2e | ||
|
|
93105200d7 | ||
|
|
f48ede5d7e | ||
|
|
b73181487c | ||
|
|
caee2892c4 | ||
|
|
432bd32967 | ||
|
|
235bc0a598 | ||
|
|
f0cf26baec | ||
|
|
fffccd3787 | ||
|
|
5cfbac5eba | ||
|
|
2bce3f8d02 | ||
|
|
e210722e0e | ||
|
|
909d9a4fd1 | ||
|
|
c8b57cf9e0 | ||
|
|
d74493ced0 | ||
|
|
7783cf4ce5 | ||
|
|
27e07d1f67 | ||
|
|
40857cc57c | ||
|
|
4f764d6101 | ||
|
|
49e98f2f8b | ||
|
|
ddad026a2b | ||
|
|
b8df55ef36 | ||
|
|
be7724d8c7 | ||
|
|
c5c1c92cfb | ||
|
|
e6b219a182 | ||
|
|
d2d03358ef | ||
|
|
a4d751b40f | ||
|
|
1c73cacc82 | ||
|
|
23bfa54ec4 | ||
|
|
95138489cd | ||
|
|
c9ec69d30c | ||
|
|
0e4cabeb17 | ||
|
|
19961198fb | ||
|
|
c705c570db | ||
|
|
34d48adb4a | ||
|
|
fda973bb78 | ||
|
|
c5bfd67d6d | ||
|
|
402de69fd5 | ||
|
|
41341b46de | ||
|
|
3574517014 | ||
|
|
cca785e1f0 | ||
|
|
4215e058d0 | ||
|
|
60925778c6 | ||
|
|
15233bf100 | ||
|
|
2f91fbe931 | ||
|
|
90febfd46f | ||
|
|
ccc5b68111 | ||
|
|
07f6b86138 | ||
|
|
7b2667feaa | ||
|
|
48bd7b334d | ||
|
|
9dd4242590 | ||
|
|
ac8c29e9c5 | ||
|
|
387b0f68a8 | ||
|
|
fa130bf649 | ||
|
|
e596403c0a | ||
|
|
1030bd0b0f | ||
|
|
985e463ddf | ||
|
|
3787fa637a | ||
|
|
ac62eb40a0 | ||
|
|
b9e883beba | ||
|
|
6281c002e0 | ||
|
|
4e8a3cab2f | ||
|
|
423b90a661 | ||
|
|
63fc99dd34 | ||
|
|
71caf09c70 | ||
|
|
ee3164a8f6 | ||
|
|
3d5f612ac9 | ||
|
|
79f2eaf808 | ||
|
|
1806a1438a | ||
|
|
5108967c35 | ||
|
|
d0f1014bef | ||
|
|
2afc143051 | ||
|
|
b2bf70e4ce | ||
|
|
6a5f090198 | ||
|
|
92c0543743 | ||
|
|
1859aaad7d | ||
|
|
7e67ce536d | ||
|
|
2bd573963a | ||
|
|
447e958e74 | ||
|
|
43908b37cd | ||
|
|
04b631e4c9 | ||
|
|
2e8fc777d2 | ||
|
|
e060c83cf8 | ||
|
|
5480af2d5d | ||
|
|
ff28605d39 | ||
|
|
fe0ca9b9a3 | ||
|
|
54ef70aee9 | ||
|
|
e24d077061 | ||
|
|
7ebf29d857 | ||
|
|
33c6925376 | ||
|
|
0b383a1f3b | ||
|
|
70d1b0807c | ||
|
|
8e1f4d628b | ||
|
|
ef29603f05 | ||
|
|
71b27d95fa | ||
|
|
787c1c6c39 | ||
|
|
74e4848edc | ||
|
|
9a7690473a | ||
|
|
c401edde6b | ||
|
|
3fc1ba27e5 | ||
|
|
b2212d2edb | ||
|
|
76f7dc82fc | ||
|
|
00683a38c5 | ||
|
|
ad06cbc835 |
@@ -1,9 +1,33 @@
|
||||
### Checklist
|
||||
- [ ] The title of this issue is "to the point" and descriptive.
|
||||
- [ ] This issue describes what is happening.
|
||||
- [ ] This issue describes what components are affected (e.g. name of plugin/controller)
|
||||
- [ ] This issue describes how to reproduce it.
|
||||
- [ ] This issue describes when it was introduced (when known) and what version is now showing the problem.
|
||||
|
||||
### I have...
|
||||
- [ ] searched the [issue tracker](https://github.com/letscontrolit/ESPEasy/issues) or the [forum](https://www.letscontrolit.com/forum/viewforum.php?f=1) for a similar issue. (include links when applicable)
|
||||
- [ ] entered a system description using "Copy info to clipboard" on the sysinfo page. (when possible)
|
||||
- [ ] entered the full filename of the used version (e.g. `ESP_Easy_mega-20181001_test_ESP8266_4096_VCC.bin` )
|
||||
- [ ] given a list of active plugins or controllers when applicable.
|
||||
- [ ] filled out all applicable fields below.
|
||||
|
||||
### Steps already tried...
|
||||
- [ ] Tried a clean install (empty `.bin` files are included in the ZIP)
|
||||
- [ ] Tested previous/other build (mention which one already tested)
|
||||
- [ ] Tested on other node to make sure hardware isn't defective.
|
||||
- [ ] Verified if the problem is limited to a single plugin/controller
|
||||
|
||||
|
||||
|
||||
### If you self compile, please state this and PLEASE try to ONLY REPORT ISSUES WITH OFFICIAL BUILDS! ###
|
||||
<!--- If you self compile, please state this and PLEASE try to ONLY REPORT ISSUES WITH OFFICIAL BUILDS! --->
|
||||
<!--- NOTE: This is not a support forum! For questions and support go here: --->
|
||||
<!--- https://www.letscontrolit.com/forum/viewforum.php?f=1 --->
|
||||
<!--- Remove topics that are not applicable to your feature request of issue --->
|
||||
<!--- Remember to have a "to the point" TITLE --->
|
||||
|
||||
|
||||
### Summarize of the problem/feature request
|
||||
<!--- Describe the problem or feature request --->
|
||||
YOUR TEXT GOES HERE
|
||||
|
||||
@@ -18,3 +18,9 @@ lib/readme.txt
|
||||
src/Custom.h
|
||||
/ESPEasy
|
||||
test/output_export.cpp
|
||||
.vscode
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
|
||||
docs/build/
|
||||
|
||||
+6
-7
@@ -22,20 +22,19 @@ addons:
|
||||
|
||||
|
||||
install:
|
||||
- pip install -U platformio
|
||||
- pip install -U platformio sphinx recommonmark sphinx_bootstrap_theme
|
||||
|
||||
script:
|
||||
- platformio update
|
||||
# patch platformio core libs for PUYA bug (https://github.com/letscontrolit/ESPEasy/issues/650)
|
||||
- cd patches; ./check_puya_patch; cd ..
|
||||
|
||||
# - bash ./preflight.sh # make sure input files are OK before wasting time with prereqs
|
||||
# - cppcheck --enable=warning src/*.ino -q --force -I src --include=src/ESPEasy.ino --error-exitcode=1
|
||||
# - ./memanalyzer.py ~/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-objdump
|
||||
- PLATFORMIO_BUILD_FLAGS="-D CONTINUOUS_INTEGRATION" platformio run
|
||||
- PLATFORMIO_BUILD_FLAGS="-D CONTINUOUS_INTEGRATION" platformio run
|
||||
|
||||
# patch platformio core libs for PUYA bug (https://github.com/letscontrolit/ESPEasy/issues/650)
|
||||
- cd patches; ./check_puya_patch; cd ..
|
||||
- PLATFORMIO_BUILD_FLAGS="-D CONTINUOUS_INTEGRATION" platformio run -s --environment dev_ESP8266PUYA_1024
|
||||
- PLATFORMIO_BUILD_FLAGS="-D CONTINUOUS_INTEGRATION" platformio run -s --environment dev_ESP8266PUYA_1024
|
||||
|
||||
|
||||
before_deploy:
|
||||
- ./before_deploy
|
||||
- export RELEASE_FILE=$(ls ESPEasy*.zip)
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
|Latest Nightly | Build Status | Patreon | Ko-Fi | PayPal |
|
||||
|-------|-------|-------|-------|-------|
|
||||
| [](https://github.com/letscontrolit/ESPEasy/releases/latest) | [](https://travis-ci.org/letscontrolit/ESPEasy) | [](https://www.patreon.com/GrovkillenTDer) | [](https://ko-fi.com/grovkillentder) | [](https://www.paypal.me/espeasy) |
|
||||
|
||||
For ways to *support* us, see [this announcement on the forum](https://www.letscontrolit.com/forum/viewtopic.php?f=14&t=5787), or have a look at the [Patreon](https://www.patreon.com/GrovkillenTDer), [Ko-Fi](https://ko-fi.com/grovkillentder) or [PayPal](https://www.paypal.me/espeasy) links above.
|
||||
|
||||
# ESPEasy (development branch)
|
||||
|
||||
Badge | Info |
|
||||
-------|-------|
|
||||
[](https://travis-ci.org/letscontrolit/ESPEasy) | build status |
|
||||
[](https://github.com/letscontrolit/ESPEasy/releases/latest) | latest nightly |
|
||||
|
||||
Introduction and wiki: https://www.letscontrolit.com/wiki/index.php/ESPEasy#Introduction
|
||||
|
||||
@@ -39,4 +41,4 @@ ESPEasy_mega-20180102_dev_ESP8285_1024.bin | ESP8285 with 1Mb flash | Stabl
|
||||
|
||||
Details and discussion are on the Experimental forum: https://www.letscontrolit.com/forum/viewforum.php?f=18
|
||||
|
||||
We're also on IRC: #ESPEasy @freenode
|
||||
Automated builds of the (new) documentation can be found at [ESPEasy.readthedocs.io](https://espeasy.readthedocs.io/en/latest/)
|
||||
|
||||
+18
-9
@@ -10,6 +10,9 @@ for ENV in \
|
||||
normal_ESP8266_1024 \
|
||||
normal_ESP8266_4096 \
|
||||
normal_ESP8285_1024 \
|
||||
normal_IR_ESP8266_4096 \
|
||||
normal_core_241_ESP8266_1024 \
|
||||
normal_core_241_ESP8266_4096 \
|
||||
test_ESP8266_1024\
|
||||
test_ESP8266_4096\
|
||||
test_ESP8266_4096_VCC\
|
||||
@@ -17,26 +20,32 @@ for ENV in \
|
||||
dev_ESP8266_1024\
|
||||
dev_ESP8266_4096\
|
||||
dev_ESP8285_1024\
|
||||
dev_ESP8266PUYA_1024\
|
||||
dev_ESP8266PUYA_1024_VCC\
|
||||
hard_SONOFF_POW\
|
||||
esp32dev;\
|
||||
hard_SONOFF_POW_R2_4M\
|
||||
minimal_ESP8266_1024_OTA\
|
||||
minimal_ESP8285_1024_OTA\
|
||||
esp32dev\
|
||||
esp32test_1M8_partition;\
|
||||
do
|
||||
echo
|
||||
echo "### Deploying environment $ENV for version $VERSION"
|
||||
BIN=.pioenvs/${ENV}/ESP_Easy_${VERSION}_${ENV}.bin
|
||||
cp .pioenvs/${ENV}/firmware.bin $BIN
|
||||
python2 crc2.py $BIN
|
||||
mv $BIN "dist/ESP_Easy_${VERSION}_${ENV}.bin"
|
||||
mv $BIN "dist/bin/ESP_Easy_${VERSION}_${ENV}.bin"
|
||||
done
|
||||
|
||||
|
||||
#create a source structure that is the same as the original ESPEasy project (and works with the howto on the wiki)
|
||||
rm -rf dist/Source 2>/dev/null
|
||||
mkdir dist/Source
|
||||
cp -r lib dist/Source/
|
||||
cp -r src dist/Source/
|
||||
cp platformio.ini dist/Source/
|
||||
#rm -rf dist/Source 2>/dev/null
|
||||
rm -rf dist/Docs 2>/dev/null
|
||||
|
||||
mkdir -p dist/source
|
||||
#mkdir -p dist/docs
|
||||
cp -r lib dist/source/
|
||||
cp -r src dist/source/
|
||||
#cp -r docs/build/ dist/docs/
|
||||
cp platformio.ini dist/source/
|
||||
|
||||
cd dist
|
||||
|
||||
|
||||
Vendored
BIN
Binary file not shown.
Vendored
+66
@@ -0,0 +1,66 @@
|
||||
_____ ____ ____
|
||||
| ____/ ___|| _ \ ___ __ _ ___ _ _
|
||||
| _| \___ \| |_) / _ \/ _` / __| | | |
|
||||
| |___ ___) | __/ __/ (_| \__ \ |_| |
|
||||
|_____|____/|_| \___|\__,_|___/\__, |
|
||||
|___/
|
||||
|
||||
|
||||
This is the distribution folder for ESPeasy.
|
||||
In here you will find a flash tool to program the ESP module.
|
||||
|
||||
Also a number of binary images is included.
|
||||
|
||||
The filename is quite descriptive:
|
||||
ESP_Easy_mega-<date>_<buildType>_<chip>_<memorySize>.bin
|
||||
|
||||
Build type can be: (differ in included plugins)
|
||||
- normal => Only Stable plugins and controllers
|
||||
- test => Stable + Testing
|
||||
- dev => Stable + Testing + Development
|
||||
|
||||
There is also a number of special builds:
|
||||
- normal_IR => "Normal" + IR receiver/transmitter plugins and library
|
||||
- hard_xxxxx => Special builds for some off-the-shelf hardware.
|
||||
- normal_core_241 => "Normal" using core 2.4.1, since 2.4.2 has issues with PWM
|
||||
- minimal_ESP82xx_1024_OTA => Minimum number of plugins and a limited set of controllers included to be able to perform a 2-step OTA on 1 MB flash nodes.
|
||||
|
||||
Chip can be:
|
||||
- ESP8266 => Most likely option
|
||||
- ESP8285 => Used in some Sonoff modules
|
||||
- ESP32 => Experimental support at this moment
|
||||
|
||||
MemorySize can be:
|
||||
- 1024 => 1 MB flash modules (e.g. almost all Sonoff modules)
|
||||
- 2048 => 2 MB flash modules (e.g. Shelly1/WROOM02)
|
||||
- 4096 => 4 MB flash modules (e.g. NodeMCU/ESP32)
|
||||
|
||||
ESP32 now has 2 builds:
|
||||
- esp32dev Using the default partition layout (1.4 MB for the sketch)
|
||||
- esp32test_1M8_partition Larger sketch partition (1.8MB) smaller SPIFFS (316 kB)
|
||||
|
||||
Please note that changing between those versions will destroy the settings!
|
||||
The SPIFFS partition will be lost and that contains all settings.
|
||||
|
||||
|
||||
To help recover from a bad flash, there are also blank images included.
|
||||
- blank_1MB.bin
|
||||
- blank_2MB.bin
|
||||
- blank_4MB.bin
|
||||
|
||||
When the wrong image is flashed, or the module behaves unstable, or is in a reboot loop,
|
||||
flash these images first and then the right image for the module.
|
||||
|
||||
ESP.Easy.Flasher.exe...
|
||||
... is the new flashing tool for ESP Easy. You need to run it in elevated mode (as admin)
|
||||
for it to fetch the COM ports correctly. If you want you may save YOUR settings using the
|
||||
"Save as default settings" button in the lower left corner. If the window is too big or
|
||||
too small you can experiment with the "Pixels Per Inch" variable in the
|
||||
..\Settings\Default.ini file. Setting it to =96 is working for most users but the
|
||||
application will try to find the most optimal value by default. Sometimes it fails to
|
||||
do that. More information about the tool is found here:
|
||||
https://github.com/Grovkillen/ESP_Easy_Flasher
|
||||
|
||||
Further reading:
|
||||
For more information, see: https://github.com/letscontrolit/ESPEasy
|
||||
Or our forum: https://www.letscontrolit.com/forum/
|
||||
Vendored
+1109
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
|
||||
# Minimal makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
SOURCEDIR = source
|
||||
BUILDDIR = build
|
||||
|
||||
# Put it first so that "make" without argument is like "make help".
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
|
||||
.PHONY: help Makefile
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
@@ -0,0 +1,35 @@
|
||||
@ECHO OFF
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set SOURCEDIR=source
|
||||
set BUILDDIR=build
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
%SPHINXBUILD% >NUL 2>NUL
|
||||
if errorlevel 9009 (
|
||||
echo.
|
||||
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
||||
echo.installed, then set the SPHINXBUILD environment variable to point
|
||||
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
||||
echo.may add the Sphinx directory to PATH.
|
||||
echo.
|
||||
echo.If you don't have Sphinx installed, grab it from
|
||||
echo.http://sphinx-doc.org/
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
goto end
|
||||
|
||||
:help
|
||||
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
|
||||
:end
|
||||
popd
|
||||
@@ -0,0 +1,3 @@
|
||||
recommonmark
|
||||
Sphinx
|
||||
sphinx-bootstrap-theme
|
||||
@@ -0,0 +1,66 @@
|
||||
Controller
|
||||
**********
|
||||
|
||||
A controller is a component to enable a plugin to send data elsewhere.
|
||||
|
||||
- Up-to 3 controllers can be active in ESPEasy.
|
||||
- Per plugin up-to 3 active controllers can be selected.
|
||||
- For some controllers an additional parameter can be given.
|
||||
|
||||
For example, Domoticz needs an 'IDX' value to identify the configured entry in
|
||||
Domoticz for which new data is sent.
|
||||
|
||||
Controller Parameters
|
||||
=====================
|
||||
|
||||
Generic fields
|
||||
--------------
|
||||
|
||||
- **Protocol** - The type of controller (e.g. ThingSpeak/OpenHAB MQTT/etc.)
|
||||
- **Locate Controller** - Selection between hostname/IP
|
||||
- **Controller Hostname/IP** - The address to reach the selected service
|
||||
- **Controller Port** - TCP/UDP Port number (0...65536)
|
||||
- **Enabled** - Whether or not the controller is active.
|
||||
|
||||
Send queue parameters
|
||||
---------------------
|
||||
|
||||
Controllers have a queue to keep unsent messages.
|
||||
This queue is used to handle message bursts and also store messages which are recorded
|
||||
before WiFi connection is made or during lost connection.
|
||||
|
||||
- **Minimum Send Interval** - Minimum time between two messages in msec.
|
||||
- **Max Queue Depth** - Maximum length of the buffer queue to keep unsent messages.
|
||||
- **Max Retries** - Maximum number of retries to send a message.
|
||||
- **Full Queue Action** - How to handle when queue is full, ignore new or delete oldest message.
|
||||
- **Client Timeout** - Timeout in msec for an network connection used by the controller.
|
||||
- **Check Reply** - When set to false, a sent message is considered always successful.
|
||||
|
||||
|
||||
Sample ThingSpeak configuration
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Some controllers, like ThingSpeak, need a specific configuration.
|
||||
ThingSpeak only allows a message every 15 seconds for the free accounts.
|
||||
|
||||
- **Minimum Send Interval** - 15000 msec
|
||||
- **Max Queue Depth** - 1 (only report the last value)
|
||||
- **Max Retries** - 2
|
||||
- **Full Queue Action** - Delete Oldest
|
||||
- **Client Timeout** - 500 msec (server is online, so timeout must be a bit longer)
|
||||
|
||||
|
||||
Controller user credentials
|
||||
---------------------------
|
||||
|
||||
- **Controller User** - User name (optional)
|
||||
- **Controller Password** - Password (optional)
|
||||
|
||||
MQTT related settings
|
||||
---------------------
|
||||
|
||||
- **Controller Subscribe** - Subscribe to the given topic.
|
||||
- **Controller Publish** - Publish to the given topic.
|
||||
- **Controller lwl topic** - Topic to which LWT (Last Will Testament) messages should be sent.
|
||||
- **LWT Connect Message** - Connection established message.
|
||||
- **LWT Disconnect Message** - Connection lost message (sent to broker during connect and published by broker when connection is lost)
|
||||
@@ -0,0 +1,2 @@
|
||||
About Us
|
||||
********
|
||||
@@ -0,0 +1,2 @@
|
||||
ESPEasy Function Blocks
|
||||
***********************
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,35 @@
|
||||
Documentation
|
||||
*************
|
||||
|
||||
For documentation we use Sphinx and this will be read by ReadTheDocs.
|
||||
We use the `Sphinx Bootstrap Theme <https://github.com/ryan-roemer/sphinx-bootstrap-theme>`_
|
||||
|
||||
This documentation is included in the GitHub repository.
|
||||
It allows us to create documentation per version of ESPEasy.
|
||||
|
||||
See also the `ESPEasy wiki <https://www.letscontrolit.com/wiki/index.php/ESPEasy>`_
|
||||
for more documentation which has not been moved here.
|
||||
|
||||
Needed Python packages::
|
||||
|
||||
pip install sphinx recommonmark sphinx_bootstrap_theme
|
||||
|
||||
PlatformIO with Atom
|
||||
====================
|
||||
|
||||
With the ESPEasy project open in Atom, open the PIO terminal in Atom.
|
||||
|
||||
Install dependencies::
|
||||
|
||||
cd docs
|
||||
pip install ... (see needed Python packages above)
|
||||
|
||||
Build on Windows::
|
||||
|
||||
cd docs
|
||||
.\make.bat html
|
||||
|
||||
Build on Linux/Mac::
|
||||
|
||||
cd docs
|
||||
./make html
|
||||
@@ -0,0 +1,2 @@
|
||||
Plugins
|
||||
*******
|
||||
@@ -0,0 +1,2 @@
|
||||
Command Reference
|
||||
*****************
|
||||
@@ -0,0 +1,2 @@
|
||||
System Variables
|
||||
****************
|
||||
@@ -0,0 +1,2 @@
|
||||
Rules
|
||||
*****
|
||||
@@ -0,0 +1,25 @@
|
||||
WiFi
|
||||
****
|
||||
|
||||
WiFi disconnect reasons
|
||||
=======================
|
||||
|
||||
Beacon timeout (200)
|
||||
--------------------
|
||||
|
||||
For more information on the Beacon frame, see `Wikipedia <https://en.wikipedia.org/wiki/Beacon_frame>`_.
|
||||
|
||||
In short, the access point sends periodically a packet containing information about the network.
|
||||
This interval is typically 100 TU (102.4 msec).
|
||||
The ESP module is trying to listen to this beacon every time, but for a number of reasons it may
|
||||
miss a beacon frame.
|
||||
The timeout is longer than 100 TU, so it must miss a number of these beacon frames
|
||||
to report a beacon timeout.
|
||||
Reasons to miss such a beacon frame are:
|
||||
|
||||
- too busy processing other blocking tasks (very likely)
|
||||
- access point not sending a beacon due to high traffic demands of others (depending on brand/model/settings)
|
||||
- RF disturbances (not likely given how often this occurs)
|
||||
- clock drift (not really likely)
|
||||
|
||||
So the "beacon timeout" is happening every now and then on the ESP nodes and ESPeasy will try to reconnect.
|
||||
@@ -0,0 +1,286 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file does only contain a selection of the most common options. For a
|
||||
# full list see the documentation:
|
||||
# http://www.sphinx-doc.org/en/master/config
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import os
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
from recommonmark.parser import CommonMarkParser
|
||||
import sphinx_bootstrap_theme
|
||||
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = u'ESPEasy'
|
||||
copyright = u'2018, ESPEasy'
|
||||
author = u'Many'
|
||||
|
||||
# The short X.Y version
|
||||
version = u''
|
||||
# The full version, including alpha/beta/rc tags
|
||||
release = u'2.1b1'
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.intersphinx',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.imgmath',
|
||||
'sphinx.ext.imgconverter',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
source_parsers = {
|
||||
'.md': CommonMarkParser,
|
||||
}
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
source_suffix = ['.rst', '.md']
|
||||
#source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = []
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = None
|
||||
|
||||
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
html_logo = 'ESPEasy/espeasy_logo.png'
|
||||
html_favicon = 'ESPEasy/favicon.ico'
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
#html_theme = 'sphinx_rtd_theme'
|
||||
html_theme = 'bootstrap'
|
||||
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
# html_theme_options = {}
|
||||
#html_theme_options = {
|
||||
# 'canonical_url': '',
|
||||
# 'analytics_id': '',
|
||||
# 'logo_only': False,
|
||||
# 'display_version': True,
|
||||
# 'prev_next_buttons_location': 'bottom',
|
||||
# 'style_external_links': False,
|
||||
# # Toc options
|
||||
# 'collapse_navigation': True,
|
||||
# 'sticky_navigation': True,
|
||||
# 'navigation_depth': 4,
|
||||
# 'includehidden': True,
|
||||
# 'titles_only': False
|
||||
#}
|
||||
|
||||
html_theme_options = {
|
||||
# Navigation bar title. (Default: ``project`` value)
|
||||
'navbar_title': "ESPEasy",
|
||||
|
||||
# Tab name for entire site. (Default: "Site")
|
||||
'navbar_site_name': "Site",
|
||||
|
||||
# A list of tuples containing pages or urls to link to.
|
||||
# Valid tuples should be in the following forms:
|
||||
# (name, page) # a link to a page
|
||||
# (name, "/aa/bb", 1) # a link to an arbitrary relative url
|
||||
# (name, "http://example.com", True) # arbitrary absolute url
|
||||
# Note the "1" or "True" value above as the third argument to indicate
|
||||
# an arbitrary url.
|
||||
'navbar_links': [
|
||||
("Rules", "rules"),
|
||||
("Forum", "https://www.letscontrolit.com/forum/viewforum.php?f=1", True),
|
||||
],
|
||||
|
||||
# Render the next and previous page links in navbar. (Default: true)
|
||||
'navbar_sidebarrel': True,
|
||||
|
||||
# Render the current pages TOC in the navbar. (Default: true)
|
||||
'navbar_pagenav': True,
|
||||
|
||||
# Tab name for the current pages TOC. (Default: "Page")
|
||||
'navbar_pagenav_name': "Page",
|
||||
|
||||
# Global TOC depth for "site" navbar tab. (Default: 1)
|
||||
# Switching to -1 shows all levels.
|
||||
'globaltoc_depth': 2,
|
||||
|
||||
# Include hidden TOCs in Site navbar?
|
||||
#
|
||||
# Note: If this is "false", you cannot have mixed ``:hidden:`` and
|
||||
# non-hidden ``toctree`` directives in the same page, or else the build
|
||||
# will break.
|
||||
#
|
||||
# Values: "true" (default) or "false"
|
||||
'globaltoc_includehidden': "true",
|
||||
|
||||
# HTML navbar class (Default: "navbar") to attach to <div> element.
|
||||
# For black navbar, do "navbar navbar-inverse"
|
||||
'navbar_class': "navbar navbar-inverse",
|
||||
|
||||
# Fix navigation bar to top of page?
|
||||
# Values: "true" (default) or "false"
|
||||
'navbar_fixed_top': "true",
|
||||
|
||||
# Location of link to source.
|
||||
# Options are "nav" (default), "footer" or anything else to exclude.
|
||||
'source_link_position': "none",
|
||||
|
||||
# Bootswatch (http://bootswatch.com/) theme.
|
||||
#
|
||||
# Options are nothing (default) or the name of a valid theme
|
||||
# such as "cosmo" or "sandstone".
|
||||
#
|
||||
# The set of valid themes depend on the version of Bootstrap
|
||||
# that's used (the next config option).
|
||||
#
|
||||
# Currently, the supported themes are:
|
||||
# - Bootstrap 2: https://bootswatch.com/2
|
||||
# - Bootstrap 3: https://bootswatch.com/3
|
||||
'bootswatch_theme': "cerulean",
|
||||
|
||||
# Choose Bootstrap version.
|
||||
# Values: "3" (default) or "2" (in quotes)
|
||||
'bootstrap_version': "3",
|
||||
}
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Custom sidebar templates, must be a dictionary that maps document names
|
||||
# to template names.
|
||||
#
|
||||
# The default sidebars (for documents that don't match any pattern) are
|
||||
# defined by theme itself. Builtin themes are using these templates by
|
||||
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
|
||||
# 'searchbox.html']``.
|
||||
#
|
||||
# html_sidebars = {}
|
||||
|
||||
|
||||
# -- Options for HTMLHelp output ---------------------------------------------
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'ESPEasydoc'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ------------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'ESPEasy.tex', u'ESPEasy Documentation',
|
||||
u'Many', 'manual'),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for manual page output ------------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'espeasy', u'ESPEasy Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
|
||||
# -- Options for Texinfo output ----------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'ESPEasy', u'ESPEasy Documentation',
|
||||
author, 'ESPEasy', 'ESP82xx/ESP32 firmware to connect people with any level of experience to system automation.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for Epub output -------------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
|
||||
# The unique identifier of the text. This can be a ISBN number
|
||||
# or the project homepage.
|
||||
#
|
||||
# epub_identifier = ''
|
||||
|
||||
# A unique identification for the text.
|
||||
#
|
||||
# epub_uid = ''
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ['search.html']
|
||||
|
||||
|
||||
# -- Extension configuration -------------------------------------------------
|
||||
|
||||
# -- Options for intersphinx extension ---------------------------------------
|
||||
|
||||
# Example configuration for intersphinx: refer to the Python standard library.
|
||||
intersphinx_mapping = {'https://docs.python.org/': None}
|
||||
|
||||
# -- Options for todo extension ----------------------------------------------
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = True
|
||||
@@ -0,0 +1,39 @@
|
||||
.. ESPEasy documentation master file, created by
|
||||
sphinx-quickstart on Sat Oct 06 22:34:34 2018.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Welcome to ESPEasy's documentation!
|
||||
===================================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Table of Contents
|
||||
|
||||
ESPEasy/AboutUs.rst
|
||||
ESPEasy/FunctionBlocks.rst
|
||||
Controller/Controller.rst
|
||||
Plugin/Plugin.rst
|
||||
Rules/Rules.rst
|
||||
WiFi/WiFi.rst
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\appendix
|
||||
|
||||
|
||||
.. toctree::
|
||||
:caption: Appendix
|
||||
|
||||
Participate/Documentation.rst
|
||||
Reference/Command.rst
|
||||
Reference/SystemVariable.rst
|
||||
|
||||
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
@@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# This script walks through the assets folder and minifys all JS, HTML, CSS and SVG files. It also generates
|
||||
# the corresponding constants that are added to the data.h file on esp8266_deauther folder.
|
||||
#
|
||||
# @Author Erick B. Tedeschi < erickbt86 [at] gmail [dot] com >
|
||||
# @Author Wandmalfarbe https://github.com/Wandmalfarbe
|
||||
#
|
||||
# See: https://github.com/letscontrolit/ESPEasy/issues/1671#issuecomment-415144898
|
||||
|
||||
outputfile="$(pwd)/data_h_temp"
|
||||
|
||||
rm $outputfile
|
||||
|
||||
function minify_html_css {
|
||||
file=$1
|
||||
curl -X POST -s --data-urlencode "input@$file" http://html-minifier.com/raw > /tmp/converter.temp
|
||||
}
|
||||
|
||||
function minify_js {
|
||||
file=$1
|
||||
curl -X POST -s --data-urlencode "input@$file" https://javascript-minifier.com/raw > /tmp/converter.temp
|
||||
}
|
||||
|
||||
function minify_svg {
|
||||
file=$1
|
||||
svgo -i /Users/User/Desktop/icons/tools.svg -o - > /tmp/converter.temp
|
||||
}
|
||||
|
||||
function ascii2hexCstyle {
|
||||
file_name=$(constFileName $1)
|
||||
result=$(cat /tmp/converter.temp | hexdump -ve '1/1 "0x%.2x,"')
|
||||
result=$(echo $result | sed 's/,$//')
|
||||
echo "const char DATA_${file_name}[] PROGMEM = {$result};"
|
||||
}
|
||||
|
||||
function constFileName {
|
||||
extension=$(echo $1 | egrep -io "(json|svg|css|js|html)$" | tr "[:lower:]" "[:upper:]")
|
||||
file=$(echo $1 | sed 's/\.json//' | sed 's/\.svg//' | sed 's/\.css//' | sed 's/\.html//' | sed 's/\.js//' | sed 's/\.\///' | tr '/' '_' | tr '.' '_' | tr '-' '_' | tr "[:lower:]" "[:upper:]")
|
||||
underscore="_"
|
||||
echo $file$underscore$extension
|
||||
}
|
||||
|
||||
|
||||
cd static
|
||||
file_list=$(find . -type f)
|
||||
|
||||
for file in $file_list; do
|
||||
echo "Processing: $file"
|
||||
file_name=$(constFileName $file)
|
||||
echo " Array Name: $file_name"
|
||||
|
||||
if [[ "$file" == *.min.js ]]; then
|
||||
echo " JS already minified"
|
||||
cat $file > /tmp/converter.temp
|
||||
ascii2hexCstyle $file >> $outputfile
|
||||
elif [[ "$file" == *.js ]]; then
|
||||
echo " JS minify"
|
||||
minify_js $file
|
||||
ascii2hexCstyle $file >> $outputfile
|
||||
elif [[ "$file" == *.min.css ]]; then
|
||||
echo " CSS already minified"
|
||||
cat $file > /tmp/converter.temp
|
||||
ascii2hexCstyle $file >> $outputfile
|
||||
elif [[ "$file" == *.html ]] || [[ "$file" == *.css ]]; then
|
||||
echo " HTML and CSS minify"
|
||||
minify_html_css $file
|
||||
ascii2hexCstyle $file >> $outputfile
|
||||
elif [[ "$file" == *.svg ]]; then
|
||||
echo " SVG minify"
|
||||
minify_svg $file
|
||||
ascii2hexCstyle $file >> $outputfile
|
||||
else
|
||||
echo " without minifier"
|
||||
cat $file > /tmp/converter.temp
|
||||
ascii2hexCstyle $file >> $outputfile
|
||||
fi
|
||||
echo ""
|
||||
sleep 1
|
||||
done
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x5000,
|
||||
otadata, data, ota, 0xe000, 0x2000,
|
||||
app0, app, ota_0, 0x10000, 0x140000,
|
||||
app1, app, ota_1, 0x150000,0x140000,
|
||||
eeprom, data, 0x99, 0x290000,0x1000,
|
||||
spiffs, data, spiffs, 0x291000,0x16F000,
|
||||
|
@@ -0,0 +1,7 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x5000,
|
||||
otadata, data, ota, 0xe000, 0x2000,
|
||||
app0, app, ota_0, 0x10000, 0x1D0000,
|
||||
app1, app, ota_1, 0x1E0000,0x1D0000,
|
||||
eeprom, data, 0x99, 0x3B0000,0x1000,
|
||||
spiffs, data, spiffs, 0x3B1000,0x4F000,
|
||||
|
@@ -163,7 +163,7 @@ void loop(void) {
|
||||
Serial.print(rgb_sensor.atime_ms);
|
||||
Serial.print(F("ms (0x"));
|
||||
Serial.print(rgb_sensor.atime, HEX);
|
||||
Serial.println(F(")"));
|
||||
Serial.println(")");
|
||||
|
||||
Serial.print(F("Raw R:"));
|
||||
Serial.print(rgb_sensor.r);
|
||||
@@ -182,7 +182,7 @@ void loop(void) {
|
||||
Serial.print(rgb_sensor.saturation);
|
||||
Serial.print(F(" Sat75:"));
|
||||
Serial.print(rgb_sensor.saturation75);
|
||||
Serial.print(F(" "));
|
||||
Serial.print(" ");
|
||||
Serial.println(rgb_sensor.isSaturated ? "*SATURATED*" : "");
|
||||
|
||||
Serial.print(F("CPL:"));
|
||||
|
||||
@@ -33,7 +33,7 @@ void displaySensorDetails(void)
|
||||
Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F(" lux"));
|
||||
Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F(" lux"));
|
||||
Serial.println(F("------------------------------------"));
|
||||
Serial.println(F(""));
|
||||
Serial.println("");
|
||||
delay(500);
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ void configureSensor(void)
|
||||
Serial.print((tsl.getTiming() + 1) * 100, DEC);
|
||||
Serial.println(F(" ms"));
|
||||
Serial.println(F("------------------------------------"));
|
||||
Serial.println(F(""));
|
||||
Serial.println("");
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -4207,7 +4207,7 @@ namespace Tbc {
|
||||
}
|
||||
else {
|
||||
spliceLine( indent, remainder, width-1 );
|
||||
lines.back() += "-";
|
||||
lines.back() += '-';
|
||||
}
|
||||
if( lines.size() == 1 )
|
||||
indent = _attr.indent;
|
||||
|
||||
@@ -70,6 +70,7 @@ ESPeasySoftwareSerial::ESPeasySoftwareSerial(uint8_t receivePin, uint8_t transmi
|
||||
m_rxValid = m_txValid = m_txEnableValid = false;
|
||||
m_buffer = NULL;
|
||||
m_invert = inverse_logic;
|
||||
m_rxEnabled = false;
|
||||
if (isValidGPIOpin(receivePin)) {
|
||||
m_rxPin = receivePin;
|
||||
m_buffSize = buffSize;
|
||||
@@ -140,6 +141,8 @@ uint8_t ESPeasySoftwareSerial::pinToIndex(uint8_t pin) {
|
||||
void ESPeasySoftwareSerial::begin(long speed) {
|
||||
// Use getCycleCount() loop to get as exact timing as possible
|
||||
m_bitTime = ESP.getCpuFreqMHz()*1000000/speed;
|
||||
if (!m_rxEnabled)
|
||||
enableRx(true);
|
||||
}
|
||||
|
||||
void ESPeasySoftwareSerial::setTransmitEnablePin(uint8_t transmitEnablePin) {
|
||||
@@ -160,6 +163,7 @@ void ESPeasySoftwareSerial::enableRx(bool on) {
|
||||
} else {
|
||||
detachInterrupt(m_rxPin);
|
||||
}
|
||||
m_rxEnabled = on;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,12 @@ public:
|
||||
|
||||
void rxRead();
|
||||
|
||||
// AVR compatibility methods
|
||||
bool listen() { enableRx(true); return true; }
|
||||
void end() { stopListening(); }
|
||||
bool isListening() { return m_rxEnabled; }
|
||||
bool stopListening() { enableRx(false); return true; }
|
||||
|
||||
using Print::write;
|
||||
|
||||
private:
|
||||
@@ -62,7 +68,8 @@ private:
|
||||
|
||||
// Member variables
|
||||
uint8_t m_rxPin, m_txPin, m_txEnablePin;
|
||||
bool m_rxValid, m_txValid, m_txEnableValid;
|
||||
bool m_rxValid, m_rxEnabled;
|
||||
bool m_txValid, m_txEnableValid;
|
||||
bool m_invert;
|
||||
unsigned long m_bitTime;
|
||||
uint16_t m_inPos, m_outPos;
|
||||
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
# Contributing to the IRremoteESP8266 library
|
||||
|
||||
:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
|
||||
|
||||
The following is a set of guidelines for contributing to the IRremoteESP8266 library, hosted on GitHub. These are guidelines, [not rules](http://imgur.com/mSHi8). Use your best judgment, and feel free to propose changes to this document in a pull request.
|
||||
|
||||
#### Table Of Contents
|
||||
|
||||
[Code of Conduct](#code-of-conduct)
|
||||
|
||||
[How Can I Contribute?](#how-can-i-contribute)
|
||||
* [Reporting Bugs](#reporting-bugs)
|
||||
* [Pull Requests](#pull-requests)
|
||||
|
||||
[Styleguides](#styleguides)
|
||||
* [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
|
||||
* [Git Commit Messages](#git-commit-messages)
|
||||
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
This project and everyone participating in it is governed by the principle of ["Be excellent to each other"](http://www.imdb.com/title/tt0096928/quotes). That's it. TL;DR: _Don't be a jerk._
|
||||
|
||||
## How Can I Contribute?
|
||||
|
||||
### Reporting Bugs
|
||||
|
||||
This section guides you through submitting a bug report for the library. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:.
|
||||
|
||||
Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as much detail as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](issue_template.md), the information it asks for helps us resolve issues faster.
|
||||
|
||||
> **Note:** If you find a **Closed** issue that seems like it's the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.
|
||||
|
||||
#### Before Submitting A Bug Report
|
||||
|
||||
* **Check the [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide).** You might be able to find the cause of the problem and fix it yourself. Most importantly, check if you can reproduce the problem in the latest version (a.k.a. 'master') of the library.
|
||||
* **Perform a [cursory search](https://github.com/issues?q=+is%3Aissue+repo%3Amarkszabo/IRremoteESP8266)** to see if the problem is already reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one.
|
||||
|
||||
#### How Do I Submit A (Good) Bug Report?
|
||||
|
||||
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue and provide the following information by filling in [the template](issue_template.md).
|
||||
|
||||
Explain the problem and include any additional details to help maintainers reproduce the problem:
|
||||
|
||||
* **Use a clear and descriptive title** for the issue to identify the problem.
|
||||
* **Describe the exact steps which reproduce the problem** in as much detail as possible.
|
||||
* **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).
|
||||
* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
|
||||
* **Explain which behavior you expected to see instead and why.**
|
||||
* **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more information using the guidelines below.
|
||||
|
||||
Provide more context by answering these questions:
|
||||
|
||||
* **Can you reproduce the problem in one of the code examples?**
|
||||
* **Did the problem start happening recently** (e.g. after updating to a new version of Arduino or the library) or was this always a problem?
|
||||
* If the problem started happening recently, **can you reproduce the problem in an older version of the library?** What's the most recent version in which the problem doesn't happen? You can download older versions of the library from [the releases page](https://github.com/markszabo/IRremoteESP8266/releases).
|
||||
* **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens.
|
||||
|
||||
Include details about your configuration, circuit and environment:
|
||||
|
||||
* **Which version of the library are you using?** You can get the exact version by inspecting the `library.json` file in the root directory of the library.
|
||||
* **What board are you running this on?**
|
||||
|
||||
### Pull Requests
|
||||
|
||||
* Do not include issue numbers in the PR title
|
||||
* Include as much data and comments as practicle.
|
||||
* Follow the [C++ style guide](https://google.github.io/styleguide/cppguide.html).
|
||||
* Please write or ensure Unit Tests cover the change you are making, if you can.
|
||||
* End all files with a newline
|
||||
* Avoid platform-dependent code.
|
||||
* Use c98 types where possible for better portablity.
|
||||
* In almost all cases, code & documentation should be peer-reviewed by at least one other contributor.
|
||||
* The code should pass all the existing testing infrastructure in Travis. e.g. Unit tests, cpplint, and basic compilation.
|
||||
* State if you have tested this under real conditions if you have, and what other tests you may have carried out.
|
||||
|
||||
### Git Commit Messages
|
||||
|
||||
* Limit the first line to 72 characters or less
|
||||
* Reference issues and pull requests liberally after the first line
|
||||
* Humour is always acceptable. Be liberal with it. ;-)
|
||||
* While not required, a comprehensive description of all the changes in the PR is best.
|
||||
+5
@@ -7,6 +7,11 @@
|
||||
- [Marcos de Alcântara Marinho](https://github.com/marcosamarinho/)
|
||||
- [Massimiliano Pinto](https://github.com/pintomax/)
|
||||
- [Darsh Patel](https://github.com/darshkpatel/)
|
||||
- [Jonny Graham](https://github.com/jonnygraham/)
|
||||
- [Stu Fisher](https://github.com/stufisher/)
|
||||
- [Jorge Cisneros](https://github.com/jorgecis/)
|
||||
- [Denes Varga](https://github.com/denxhun/)
|
||||
- [Brett T. Warden](https://github.com/bwarden/)
|
||||
|
||||
All contributors can be found on the [contributors site](https://github.com/markszabo/IRremoteESP8266/graphs/contributors).
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
_(Please use this template for reporting issues. You can delete what ever is not relevant. Giving us this information will help us help you faster. Please also read the [FAQ](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions) & [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide). Your problem may already have an answer there.)_
|
||||
|
||||
### Version/revison of the library used
|
||||
_Typically located in the `library.json` & `src/IRremoteESP8266.h` files in the root directory of the library.
|
||||
e.g. v2.0.0, or 'master' as at 1st of June, 2017. etc._
|
||||
|
||||
### Expected behavior
|
||||
_What steps did you do and what should it have done?_
|
||||
|
||||
e.g.
|
||||
1. Initialise the IRsend class.
|
||||
2. IRsend.sendFoobar(0xdeadbeef);
|
||||
3. Foobar branded BBQ turns on and cooks me some ribs.
|
||||
|
||||
### Actual behavior
|
||||
_What steps did you do, and what did or didn't actually happen?_
|
||||
|
||||
e.g.
|
||||
1. Initialise the IRsend class.
|
||||
2. IRsend.sendFoobar(0xdeadbeef);
|
||||
3. Foobar BBQ went into Cow(er)-saving mode and fried me a couple of eggs instead.
|
||||
|
||||
#### Output of raw data from IRrecvDumpV2.ino (if applicable)
|
||||
_Include some raw dumps of what the device saw._
|
||||
|
||||
### Steps to reproduce the behavior
|
||||
_What can we do to (pref. reliably) repeat what is happening?_
|
||||
|
||||
#### Example code used
|
||||
_Include all relevant code snippets or links to the actual code files. Tip: [How to quote your code so it is still readable](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code)._
|
||||
|
||||
#### Circuit diagram and hardware used (if applicable)
|
||||
_Link to an image of the circuit diagram used. Part number of the IR receiver module etc._
|
||||
|
||||
### I have followed the steps in the [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide) & read the [FAQ](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions)
|
||||
_Yes/No._
|
||||
|
||||
### Has this library/code previously worked as expected for you?
|
||||
_Yes/No. If "Yes", which version last worked for you?_
|
||||
|
||||
### Other useful information
|
||||
_More information is always welcome. Be verbose._
|
||||
@@ -0,0 +1,45 @@
|
||||
#----------------------------------------#
|
||||
# .gitingore for IRremoteESP8266 library #
|
||||
#----------------------------------------#
|
||||
|
||||
### Files to ignore.
|
||||
|
||||
## Editors
|
||||
# vi/vim
|
||||
**/*.swp
|
||||
|
||||
## Build environments
|
||||
# Platformio
|
||||
**/.pioenvs/
|
||||
**/.piolibdeps/
|
||||
**/.clang_complete
|
||||
**/.gcc-flags.json
|
||||
examples/**/lib
|
||||
examples/**/.travis.yml
|
||||
examples/**/.gitignore
|
||||
lib/readme.txt
|
||||
lib/googletest/**/*
|
||||
|
||||
# GCC pre-compiled headers.
|
||||
**/*.gch
|
||||
|
||||
# Python compiled files
|
||||
**/*.pyc
|
||||
|
||||
# Unit Test builds
|
||||
test/*.o
|
||||
test/*.a
|
||||
test/*_test
|
||||
|
||||
# Tools builds
|
||||
tools/*.o
|
||||
tools/*.a
|
||||
tools/gc_decode
|
||||
|
||||
.pioenvs
|
||||
.piolibdeps
|
||||
.clang_complete
|
||||
.gcc-flags.json
|
||||
|
||||
#Cygwin builds
|
||||
*.exe
|
||||
@@ -0,0 +1,4 @@
|
||||
[submodule "lib/googletest"]
|
||||
path = lib/googletest
|
||||
url = https://github.com/google/googletest.git
|
||||
branch = v1.8.x
|
||||
@@ -0,0 +1,3 @@
|
||||
[style]
|
||||
based_on_style: google
|
||||
indent_width: 2
|
||||
@@ -10,13 +10,19 @@ before_install:
|
||||
- tar xf arduino-1.8.2-linux64.tar.xz
|
||||
- sudo mv arduino-1.8.2 /usr/local/share/arduino
|
||||
- sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino
|
||||
- wget https://raw.githubusercontent.com/google/styleguide/gh-pages/cpplint/cpplint.py
|
||||
install:
|
||||
- ln -s $PWD /usr/local/share/arduino/libraries/
|
||||
- git clone https://github.com/tzapu/WiFiManager.git /usr/local/share/arduino/libraries/WiFiManager
|
||||
- git clone https://github.com/knolleary/pubsubclient.git /usr/local/share/arduino/libraries/PubSubClient
|
||||
- arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json" --save-prefs
|
||||
- arduino --install-boards esp8266:esp8266
|
||||
- arduino --board $BD --save-prefs
|
||||
- arduino --pref "compiler.warning_level=all" --save-prefs
|
||||
- sudo apt-get install jq
|
||||
- sudo pip install pylint
|
||||
script:
|
||||
# Check that everything compiles.
|
||||
- arduino --verify --board $BD $PWD/examples/IRrecvDemo/IRrecvDemo.ino
|
||||
- arduino --verify --board $BD $PWD/examples/IRGCSendDemo/IRGCSendDemo.ino
|
||||
- arduino --verify --board $BD $PWD/examples/IRGCTCPServer/IRGCTCPServer.ino
|
||||
@@ -25,8 +31,29 @@ script:
|
||||
- arduino --verify --board $BD $PWD/examples/IRsendDemo/IRsendDemo.ino
|
||||
- arduino --verify --board $BD $PWD/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
|
||||
- arduino --verify --board $BD $PWD/examples/IRsendProntoDemo/IRsendProntoDemo.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
|
||||
- arduino --verify --board $BD $PWD/examples/LGACSend/LGACSend.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnArgoAC/TurnOnArgoAC.ino
|
||||
- arduino --verify --board $BD $PWD/examples/IRMQTTServer/IRMQTTServer.ino
|
||||
- arduino --verify --board $BD $PWD/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
|
||||
# Also check the tools programs compile.
|
||||
- (cd tools; make all)
|
||||
# Check for lint issues.
|
||||
- shopt -s nullglob
|
||||
- python cpplint.py --extensions=c,cc,cpp,ino --headers=h,hpp {src,test,tools}/*.{h,c,cc,cpp,hpp,ino} examples/*/*.{h,c,cc,cpp,hpp,ino}
|
||||
- pylint {src,test,tools}/*.py
|
||||
- shopt -u nullglob
|
||||
# Build and run the unit tests.
|
||||
- (cd test; make run)
|
||||
- (cd tools; make run_tests)
|
||||
# Check the version numbers match.
|
||||
- LIB_VERSION=$(egrep "^#define\s+_IRREMOTEESP8266_VERSION_\s+" src/IRremoteESP8266.h | cut -d\" -f2)
|
||||
- test ${LIB_VERSION} == "$(jq -r .version library.json)"
|
||||
- grep -q "^version=${LIB_VERSION}$" library.properties
|
||||
|
||||
notifications:
|
||||
email:
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
set noparent
|
||||
root=src
|
||||
linelength=80
|
||||
@@ -1,152 +0,0 @@
|
||||
/*
|
||||
An Arduino sketch to emulate IR Daikin ARC433** remote control unit
|
||||
Read more on http://harizanov.com/2012/02/control-daikin-air-conditioner-over-the-internet/
|
||||
*/
|
||||
|
||||
#include <IRDaikinESP.h>
|
||||
|
||||
IRDaikinESP::IRDaikinESP(int pin) : _irsend(pin)
|
||||
{
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::begin()
|
||||
{
|
||||
_irsend.begin();
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::send()
|
||||
{
|
||||
_irsend.sendDaikin(daikin);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::checksum()
|
||||
{
|
||||
uint8_t sum = 0;
|
||||
uint8_t i;
|
||||
|
||||
for(i = 0; i <= 6; i++){
|
||||
sum += daikin[i];
|
||||
}
|
||||
|
||||
daikin[7] = sum &0xFF;
|
||||
sum=0;
|
||||
for(i = 8; i <= 25; i++){
|
||||
sum += daikin[i];
|
||||
}
|
||||
daikin[26] = sum &0xFF;
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::on()
|
||||
{
|
||||
//state = ON;
|
||||
daikin[13] |= 0x01;
|
||||
checksum();
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::off()
|
||||
{
|
||||
//state = OFF;
|
||||
daikin[13] &= 0xFE;
|
||||
checksum();
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getPower()
|
||||
{
|
||||
return (daikin[13])&0x01;
|
||||
}
|
||||
|
||||
// DAIKIN_SILENT or DAIKIN_POWERFUL
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::setAux(uint8_t aux)
|
||||
{
|
||||
daikin[21] = aux;
|
||||
checksum();
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getAux(){
|
||||
return daikin[21];
|
||||
}
|
||||
|
||||
|
||||
// Set the temp in deg C
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::setTemp(uint8_t temp)
|
||||
{
|
||||
if (temp < 18)
|
||||
temp = 18;
|
||||
else if (temp > 32)
|
||||
temp = 32;
|
||||
daikin[14] = (temp)*2;
|
||||
checksum();
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getTemp()
|
||||
{
|
||||
return (daikin[14])/2;
|
||||
}
|
||||
|
||||
// Set the speed of the fan, 0-5, 0 is auto, 1-5 is the speed
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::setFan(uint8_t fan)
|
||||
{
|
||||
// Set the fan speed bits, leave low 4 bits alone
|
||||
uint8_t fanset;
|
||||
daikin[16] = daikin[16] & 0x0F;
|
||||
if (fan >= 1 && fan <= 5)
|
||||
fanset = 0x20 + (0x10 * fan);
|
||||
else
|
||||
fanset = 0xA0;
|
||||
daikin[16] = daikin[16] | fanset;
|
||||
checksum();
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getFan()
|
||||
{
|
||||
uint8_t fan = daikin[16] >> 4;
|
||||
fan = fan - 2;
|
||||
if (fan > 5)
|
||||
fan = 0;
|
||||
return fan;
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getMode()
|
||||
{/*
|
||||
DAIKIN_COOL
|
||||
DAIKIN_HEAT
|
||||
DAIKIN_FAN
|
||||
DAIKIN_AUTO
|
||||
DAIKIN_DRY
|
||||
*/
|
||||
return (daikin[13])>>4;
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::setMode(uint8_t mode)
|
||||
{
|
||||
daikin[13]=mode<<4 | getPower();
|
||||
checksum();
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::setSwingVertical(uint8_t swing)
|
||||
{
|
||||
if (swing)
|
||||
daikin[16] = daikin[16] | 0x0F;
|
||||
else
|
||||
daikin[16] = daikin[16] & 0xF0;
|
||||
checksum();
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getSwingVertical()
|
||||
{
|
||||
return (daikin[16])&0x01;
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRDaikinESP::setSwingHorizontal(uint8_t swing)
|
||||
{
|
||||
if (swing)
|
||||
daikin[17] = daikin[17] | 0x0F;
|
||||
else
|
||||
daikin[17] = daikin[17] & 0xF0;
|
||||
checksum();
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRDaikinESP::getSwingHorizontal()
|
||||
{
|
||||
return (daikin[17])&0x01;
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <Arduino.h>
|
||||
|
||||
#define DAIKIN_COOL B011
|
||||
#define DAIKIN_HEAT B100
|
||||
#define DAIKIN_FAN B110
|
||||
#define DAIKIN_AUTO B000
|
||||
#define DAIKIN_DRY B010
|
||||
|
||||
#define DAIKIN_POWERFUL B00000010
|
||||
#define DAIKIN_SILENT B00100000
|
||||
|
||||
/*
|
||||
Daikin AC map
|
||||
byte 7= checksum of the first part (and last byte before a 29ms pause)
|
||||
byte 13=mode
|
||||
b7 = 0
|
||||
b6+b5+b4 = Mode
|
||||
Modes: b6+b5+b4
|
||||
011 = Cool
|
||||
100 = Heat (temp 23)
|
||||
110 = FAN (temp not shown, but 25)
|
||||
000 = Fully Automatic (temp 25)
|
||||
010 = DRY (temp 0xc0 = 96 degrees c)
|
||||
b3 = 0
|
||||
b2 = OFF timer set
|
||||
b1 = ON timer set
|
||||
b0 = Air Conditioner ON
|
||||
byte 14=temp*2 (Temp should be between 18 - 32)
|
||||
byte 16=Fan
|
||||
FAN control
|
||||
b7+b6+b5+b4 = Fan speed
|
||||
Fan: b7+b6+b5+b4
|
||||
0×30 = 1 bar
|
||||
0×40 = 2 bar
|
||||
0×50 = 3 bar
|
||||
0×60 = 4 bar
|
||||
0×70 = 5 bar
|
||||
0xa0 = Auto
|
||||
0xb0 = Not auto, moon + tree
|
||||
b3+b2+b1+b0 = Swing control up/down
|
||||
Swing control up/down:
|
||||
0000 = Swing up/down off
|
||||
1111 = Swing up/down on
|
||||
byte 17
|
||||
Swing control left/right:
|
||||
0000 = Swing left/right off
|
||||
1111 = Swing left/right on
|
||||
byte 21=Aux -> Powerful (bit 1), Silent (bit 5)
|
||||
byte 24=Aux2 -> Intelligent eye on (bit 7)
|
||||
byte 26= checksum of the second part
|
||||
*/
|
||||
|
||||
#define DAIKIN_COMMAND_LENGTH 27
|
||||
|
||||
class IRDaikinESP
|
||||
{
|
||||
public:
|
||||
IRDaikinESP(int pin);
|
||||
//: IRsend(pin){};
|
||||
|
||||
void send();
|
||||
|
||||
void begin();
|
||||
void on();
|
||||
void off();
|
||||
uint8_t getPower();
|
||||
|
||||
void setAux(uint8_t aux);
|
||||
uint8_t getAux();
|
||||
|
||||
void setTemp(uint8_t temp);
|
||||
uint8_t getTemp();
|
||||
|
||||
void setFan(uint8_t fan);
|
||||
uint8_t getFan();
|
||||
|
||||
uint8_t getMode();
|
||||
void setMode(uint8_t mode);
|
||||
|
||||
void setSwingVertical(uint8_t swing);
|
||||
uint8_t getSwingVertical();
|
||||
void setSwingHorizontal(uint8_t swing);
|
||||
uint8_t getSwingHorizontal();
|
||||
|
||||
private:
|
||||
// # of bytes per command
|
||||
unsigned char daikin[DAIKIN_COMMAND_LENGTH] = {
|
||||
0x11,0xDA,0x27,0xF0,0x00,0x00,0x00,0x20,
|
||||
//0 1 2 3 4 5 6 7
|
||||
0x11,0xDA,0x27,0x00,0x00,0x41,0x1E,0x00,
|
||||
//8 9 10 11 12 13 14 15
|
||||
0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0xE3 };
|
||||
//16 17 18 19 20 21 22 23 24 25 26
|
||||
|
||||
void checksum();
|
||||
|
||||
IRsend _irsend;
|
||||
};
|
||||
@@ -1,233 +0,0 @@
|
||||
/*
|
||||
Code to emulate IR Kelvinator YALIF remote control unit, which should control
|
||||
at least the following Kelvinator A/C units:
|
||||
KSV26CRC, KSV26HRC, KSV35CRC, KSV35HRC, KSV53HRC, KSV62HRC, KSV70CRC,
|
||||
KSV70HRC, KSV80HRC.
|
||||
|
||||
Note:
|
||||
* Unsupported:
|
||||
- All Sleep modes.
|
||||
- All Timer modes.
|
||||
- "I Feel" button & mode.
|
||||
- Energy Saving mode.
|
||||
- Low Heat mode.
|
||||
- Farenheit.
|
||||
*/
|
||||
|
||||
#include <IRKelvinator.h>
|
||||
|
||||
IRKelvinatorAC::IRKelvinatorAC(int pin) : _irsend(pin) {
|
||||
stateReset();
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::stateReset() {
|
||||
for (uint8_t i = 0; i < KELVINATOR_STATE_LENGTH; i++)
|
||||
remote_state[i] = 0x0;
|
||||
remote_state[3] = 0x50;
|
||||
remote_state[11] = 0x70;
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::begin() {
|
||||
_irsend.begin();
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::fixup() {
|
||||
// X-Fan mode is only valid in COOL or DRY modes.
|
||||
if (getMode() != KELVINATOR_COOL && getMode() != KELVINATOR_DRY)
|
||||
setXFan(false);
|
||||
checksum(); // Calculate the checksums
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::send() {
|
||||
fixup(); // Ensure correct settings before sending.
|
||||
_irsend.sendKelvinator(remote_state);
|
||||
}
|
||||
|
||||
uint8_t* ICACHE_FLASH_ATTR IRKelvinatorAC::getRaw() {
|
||||
fixup(); // Ensure correct settings before sending.
|
||||
return remote_state;
|
||||
}
|
||||
|
||||
// Many Bothans died to bring us this information.
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::checksum() {
|
||||
// For each command + options block.
|
||||
for (uint8_t offset = 0; offset < KELVINATOR_STATE_LENGTH; offset += 8) {
|
||||
uint8_t sum = KELVINATOR_CHECKSUM_START;
|
||||
// Sum the lower half of the first 4 bytes of this block.
|
||||
for(uint8_t i = 0; i < 4; i++) {
|
||||
sum += (remote_state[i + offset] & 0xFU);
|
||||
}
|
||||
// then sum the upper half of the next 3 bytes.
|
||||
for(uint8_t i = 4; i < 7; i++) {
|
||||
sum += (remote_state[i + offset] >> 4);
|
||||
}
|
||||
// Trim it down to fit into the 4 bits allowed. i.e. Mod 16.
|
||||
sum &= 0xFU;
|
||||
// Place it into the IR code in the top half of the 8th & 16th byte.
|
||||
remote_state[7 + offset] = (sum << 4) | (remote_state[7 + offset] & 0xFU);
|
||||
}
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::on() {
|
||||
//state = ON;
|
||||
remote_state[0] |= KELVINATOR_POWER;
|
||||
remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::off() {
|
||||
//state = OFF;
|
||||
remote_state[0] &= ~KELVINATOR_POWER;
|
||||
remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setPower(bool state) {
|
||||
if (state)
|
||||
on();
|
||||
else
|
||||
off();
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getPower() {
|
||||
return ((remote_state[0] & KELVINATOR_POWER) != 0);
|
||||
}
|
||||
|
||||
// Set the temp. in deg C
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setTemp(uint8_t temp) {
|
||||
temp = max(static_cast<uint8_t>(KELVINATOR_MIN_TEMP), temp);
|
||||
temp = min(static_cast<uint8_t>(KELVINATOR_MAX_TEMP), temp);
|
||||
remote_state[1] = (remote_state[1] & 0xF0U) | (temp - KELVINATOR_MIN_TEMP);
|
||||
remote_state[9] = remote_state[1]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
// Return the set temp. in deg C
|
||||
uint8_t ICACHE_FLASH_ATTR IRKelvinatorAC::getTemp() {
|
||||
return ((remote_state[1] & 0xFU) + KELVINATOR_MIN_TEMP);
|
||||
}
|
||||
|
||||
// Set the speed of the fan, 0-5, 0 is auto, 1-5 is the speed
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setFan(uint8_t fan) {
|
||||
fan = min(static_cast<uint8_t>(KELVINATOR_FAN_MAX), fan); // Bounds check
|
||||
|
||||
// Only change things if we need to.
|
||||
if (fan != getFan()) {
|
||||
// Set the basic fan values.
|
||||
uint8_t fan_basic = min(static_cast<uint8_t>(KELVINATOR_BASIC_FAN_MAX), fan);
|
||||
remote_state[0] = (remote_state[0] & KELVINATOR_BASIC_FAN_MASK) |
|
||||
(fan_basic << KELVINATOR_FAN_OFFSET);
|
||||
remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
|
||||
// Set the advanced(?) fan value.
|
||||
remote_state[14] = (remote_state[14] & KELVINATOR_FAN_MASK) |
|
||||
(fan << KELVINATOR_FAN_OFFSET);
|
||||
setTurbo(false); // Turbo mode is turned off if we change the fan settings.
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRKelvinatorAC::getFan() {
|
||||
return ((remote_state[14] & ~KELVINATOR_FAN_MASK) >> KELVINATOR_FAN_OFFSET);
|
||||
}
|
||||
|
||||
uint8_t ICACHE_FLASH_ATTR IRKelvinatorAC::getMode() {
|
||||
/*
|
||||
KELVINATOR_AUTO
|
||||
KELVINATOR_COOL
|
||||
KELVINATOR_DRY
|
||||
KELVINATOR_FAN
|
||||
KELVINATOR_HEAT
|
||||
*/
|
||||
return (remote_state[0] & ~KELVINATOR_MODE_MASK);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setMode(uint8_t mode) {
|
||||
// If we get an unexpected mode, default to AUTO.
|
||||
if (mode > KELVINATOR_HEAT) mode = KELVINATOR_AUTO;
|
||||
remote_state[0] = (remote_state[0] & KELVINATOR_MODE_MASK) | mode;
|
||||
remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
|
||||
if (mode == KELVINATOR_AUTO)
|
||||
// When the remote is set to Auto, it defaults to 25C and doesn't show it.
|
||||
setTemp(KELVINATOR_AUTO_TEMP);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setSwingVertical(bool state) {
|
||||
if (state) {
|
||||
remote_state[0] |= KELVINATOR_VENT_SWING;
|
||||
remote_state[4] |= KELVINATOR_VENT_SWING_V;
|
||||
}
|
||||
else {
|
||||
remote_state[4] &= ~KELVINATOR_VENT_SWING_V;
|
||||
if (! getSwingHorizontal())
|
||||
remote_state[0] &= ~KELVINATOR_VENT_SWING;
|
||||
}
|
||||
remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getSwingVertical() {
|
||||
return ((remote_state[4] & KELVINATOR_VENT_SWING_V) != 0);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setSwingHorizontal(bool state) {
|
||||
if (state) {
|
||||
remote_state[0] |= KELVINATOR_VENT_SWING;
|
||||
remote_state[4] |= KELVINATOR_VENT_SWING_H;
|
||||
}
|
||||
else {
|
||||
remote_state[4] &= ~KELVINATOR_VENT_SWING_H;
|
||||
if (! getSwingVertical())
|
||||
remote_state[0] &= ~KELVINATOR_VENT_SWING;
|
||||
}
|
||||
remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getSwingHorizontal() {
|
||||
return ((remote_state[4] & KELVINATOR_VENT_SWING_H) != 0);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setQuiet(bool state) {
|
||||
remote_state[12] &= ~KELVINATOR_QUIET;
|
||||
remote_state[12] |= (state << KELVINATOR_QUIET_OFFSET);
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getQuiet() {
|
||||
return ((remote_state[12] & KELVINATOR_QUIET) != 0);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setIonFilter(bool state) {
|
||||
remote_state[2] &= ~KELVINATOR_ION_FILTER;
|
||||
remote_state[2] |= (state << KELVINATOR_ION_FILTER_OFFSET);
|
||||
remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getIonFilter() {
|
||||
return ((remote_state[2] & KELVINATOR_ION_FILTER) != 0);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setLight(bool state) {
|
||||
remote_state[2] &= ~KELVINATOR_LIGHT;
|
||||
remote_state[2] |= (state << KELVINATOR_LIGHT_OFFSET);
|
||||
remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getLight() {
|
||||
return ((remote_state[2] & KELVINATOR_LIGHT) != 0);
|
||||
}
|
||||
|
||||
// Note: XFan mode is only valid in Cool or Dry mode.
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setXFan(bool state) {
|
||||
remote_state[2] &= ~KELVINATOR_XFAN;
|
||||
remote_state[2] |= (state << KELVINATOR_XFAN_OFFSET);
|
||||
remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getXFan() {
|
||||
return ((remote_state[2] & KELVINATOR_XFAN) != 0);
|
||||
}
|
||||
|
||||
// Note: Turbo mode is turned off if the fan speed is changed.
|
||||
void ICACHE_FLASH_ATTR IRKelvinatorAC::setTurbo(bool state) {
|
||||
remote_state[2] &= ~KELVINATOR_TURBO;
|
||||
remote_state[2] |= (state << KELVINATOR_TURBO_OFFSET);
|
||||
remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
|
||||
}
|
||||
|
||||
bool ICACHE_FLASH_ATTR IRKelvinatorAC::getTurbo() {
|
||||
return ((remote_state[2] & KELVINATOR_TURBO) != 0);
|
||||
}
|
||||
@@ -1,160 +0,0 @@
|
||||
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <Arduino.h>
|
||||
|
||||
#define KELVINATOR_AUTO 0U
|
||||
#define KELVINATOR_COOL 1U
|
||||
#define KELVINATOR_DRY 2U
|
||||
#define KELVINATOR_FAN 3U
|
||||
#define KELVINATOR_HEAT 4U
|
||||
#define KELVINATOR_MODE_MASK 0xF8U
|
||||
#define KELVINATOR_POWER 8U
|
||||
#define KELVINATOR_FAN_OFFSET 4U
|
||||
#define KELVINATOR_BASIC_FAN_MAX 3U
|
||||
#define KELVINATOR_BASIC_FAN_MASK uint8_t(0xFFU ^ (3U << KELVINATOR_FAN_OFFSET))
|
||||
#define KELVINATOR_FAN_MASK uint8_t(0xFFU ^ (7U << KELVINATOR_FAN_OFFSET))
|
||||
#define KELVINATOR_FAN_MAX 5U
|
||||
#define KELVINATOR_VENT_SWING_OFFSET 6U
|
||||
#define KELVINATOR_VENT_SWING uint8_t(1U << KELVINATOR_VENT_SWING_OFFSET)
|
||||
#define KELVINATOR_VENT_SWING_V uint8_t(1U)
|
||||
#define KELVINATOR_VENT_SWING_H uint8_t(1U << 4)
|
||||
#define KELVINATOR_SLEEP_1_AND_3 uint8_t(1U << 7)
|
||||
#define KELVINATOR_MIN_TEMP 16U // 16C
|
||||
#define KELVINATOR_MAX_TEMP 30U // 30C
|
||||
#define KELVINATOR_AUTO_TEMP 25U // 25C
|
||||
#define KELVINATOR_CHECKSUM_START 10U
|
||||
#define KELVINATOR_QUIET_OFFSET 7U
|
||||
#define KELVINATOR_QUIET uint8_t(1U << KELVINATOR_QUIET_OFFSET)
|
||||
#define KELVINATOR_ION_FILTER_OFFSET 6U
|
||||
#define KELVINATOR_ION_FILTER uint8_t(1U << KELVINATOR_ION_FILTER_OFFSET)
|
||||
#define KELVINATOR_LIGHT_OFFSET 5U
|
||||
#define KELVINATOR_LIGHT uint8_t(1U << KELVINATOR_LIGHT_OFFSET)
|
||||
#define KELVINATOR_XFAN_OFFSET 7U
|
||||
#define KELVINATOR_XFAN uint8_t(1U << KELVINATOR_XFAN_OFFSET)
|
||||
#define KELVINATOR_TURBO_OFFSET 4U
|
||||
#define KELVINATOR_TURBO uint8_t(1U << KELVINATOR_TURBO_OFFSET)
|
||||
|
||||
|
||||
/*
|
||||
Kelvinator AC map
|
||||
|
||||
(header mark and space)
|
||||
byte 0 = Basic Modes
|
||||
b2-0 = Modes
|
||||
Modes:
|
||||
000 = Auto (temp = 25C)
|
||||
001 = Cool
|
||||
010 = Dry (temp = 25C, but not shown)
|
||||
011 = Fan
|
||||
100 = Heat
|
||||
b3 = Power Status (1 = On, 0 = Off)
|
||||
b5-4 = Fan (Basic modes)
|
||||
Fan:
|
||||
00 = Auto
|
||||
01 = Fan 1
|
||||
10 = Fan 2
|
||||
11 = Fan 3 or higher (See byte 14)
|
||||
b6 = Vent swing (1 = On, 0 = Off) (See byte 4)
|
||||
b7 = Sleep Modes 1 & 3 (1 = On, 0 = Off)
|
||||
byte 1 = Temperature
|
||||
b3-0: Degrees C.
|
||||
0000 (0) = 16C
|
||||
0001 (1) = 17C
|
||||
0010 (2) = 18C
|
||||
...
|
||||
1101 (13) = 29C
|
||||
1110 (14) = 30C
|
||||
byte 2 = Extras
|
||||
b3-0 = UNKNOWN, typically 0.
|
||||
b4 = Turbo Fan (1 = On, 0 = Off)
|
||||
b5 = Light (Display) (1 = On, 0 = Off)
|
||||
b6 = Ion Filter (1 = On, 0 = Off)
|
||||
b7 = X-Fan (Fan runs for a while after power off) (1 = On, 0 = Off)
|
||||
byte 3 = Section Indicator
|
||||
b3-0 = Unused (Typically 0)
|
||||
b5-4 = Unknown (possibly timer related) (Typically B01)
|
||||
b7-6 = End of command block (B01)
|
||||
(B010 marker and a gap of 20ms)
|
||||
byte 4 = Extended options
|
||||
b0 = Swing Vent Vertical (1 = On, 0 = Off)
|
||||
b4 = Swing Vent Horizontal (1 = On, 0 = Off)
|
||||
byte 5-6 = Timer related. Typically 0 except when timer in use.
|
||||
byte 7 = checksum
|
||||
b3-0 = Unknown (Used in Timer mode)
|
||||
b7-4 = checksum of the previous bytes (0-6)
|
||||
(gap of 40ms)
|
||||
(header mark and space)
|
||||
byte 8 = Repeat of byte 0
|
||||
byte 9 = Repeat of byte 1
|
||||
byte 10 = Repeat of byte 2
|
||||
byte 11 = Section Indicator
|
||||
b3-0 = Unused (Typically 0)
|
||||
b5-4 = Unknown (possibly timer related) (Typically B11)
|
||||
b7-6 = End of command block (B01)
|
||||
(B010 marker and a gap of 20ms)
|
||||
byte 12 = Extended options
|
||||
b0 = Sleep mode 2 (1 = On, 0=Off)
|
||||
b6-1 = Unknown (Used in Sleep Mode 3, Typically B000000)
|
||||
b7 = Quiet Mode (1 = On, 0=Off)
|
||||
byte 13 = Unknown (Sleep Mode 3 related, Typically 0x00)
|
||||
byte 14 = Fan control
|
||||
b3-0 = Unknown (Sleep Mode 3 related, Typically B0000)
|
||||
b6-4 = Fan speed
|
||||
B000 (0) = Automatic
|
||||
B001 (1) = Fan 1
|
||||
B010 (2) = Fan 2
|
||||
B011 (3) = Fan 3
|
||||
B100 (4) = Fan 4
|
||||
B101 (5) = Fan 5
|
||||
byte 15 = checksum
|
||||
b3-0 = Unknown (Typically B0000)
|
||||
b7-4 = checksum of the previous bytes (8-14)
|
||||
*/
|
||||
|
||||
#define KELVINATOR_STATE_LENGTH 16
|
||||
|
||||
class IRKelvinatorAC
|
||||
{
|
||||
public:
|
||||
IRKelvinatorAC(int pin);
|
||||
//: IRsend(pin){};
|
||||
|
||||
void stateReset();
|
||||
void send();
|
||||
|
||||
void begin();
|
||||
void on();
|
||||
void off();
|
||||
void setPower(bool state);
|
||||
bool getPower();
|
||||
void setTemp(uint8_t temp);
|
||||
uint8_t getTemp();
|
||||
void setFan(uint8_t fan);
|
||||
uint8_t getFan();
|
||||
void setMode(uint8_t mode);
|
||||
uint8_t getMode();
|
||||
void setSwingVertical(bool state);
|
||||
bool getSwingVertical();
|
||||
void setSwingHorizontal(bool state);
|
||||
bool getSwingHorizontal();
|
||||
void setQuiet(bool state);
|
||||
bool getQuiet();
|
||||
void setIonFilter(bool state);
|
||||
bool getIonFilter();
|
||||
void setLight(bool state);
|
||||
bool getLight();
|
||||
void setXFan(bool state);
|
||||
bool getXFan();
|
||||
void setTurbo(bool state);
|
||||
bool getTurbo();
|
||||
uint8_t* getRaw();
|
||||
|
||||
|
||||
private:
|
||||
// The state of the IR remote in IR code form.
|
||||
uint8_t remote_state[KELVINATOR_STATE_LENGTH];
|
||||
|
||||
void checksum();
|
||||
void fixup();
|
||||
IRsend _irsend;
|
||||
};
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
Code to emulate Mitsubishi A/C IR remote control unit.
|
||||
Inspired and derived from the work done at:
|
||||
https://github.com/r45635/HVAC-IR-Control
|
||||
|
||||
Warning: Consider this very alpha code. Seems to work, but not validated.
|
||||
|
||||
Equipment it seems compatible with:
|
||||
* <Add models (A/C & remotes) you've gotten it working with here>
|
||||
*/
|
||||
|
||||
#include <IRMitsubishiAC.h>
|
||||
|
||||
// Initialise the object.
|
||||
IRMitsubishiAC::IRMitsubishiAC(int pin) : _irsend(pin) {
|
||||
stateReset();
|
||||
}
|
||||
|
||||
// Reset the state of the remote to a known good state/sequence.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::stateReset() {
|
||||
for (uint8_t i = 0; i < MITSUBISHI_AC_STATE_LENGTH; i++)
|
||||
remote_state[i] = known_good_state[i];
|
||||
checksum(); // Calculate the checksum
|
||||
}
|
||||
|
||||
// Configure the pin for output.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::begin() {
|
||||
_irsend.begin();
|
||||
}
|
||||
|
||||
// Send the current desired state to the IR LED.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::send() {
|
||||
checksum(); // Ensure correct checksum before sending.
|
||||
_irsend.sendMitsubishiAC(remote_state);
|
||||
}
|
||||
|
||||
// Return a pointer to the internal state date of the remote.
|
||||
uint8_t* ICACHE_FLASH_ATTR IRMitsubishiAC::getRaw() {
|
||||
checksum();
|
||||
return remote_state;
|
||||
}
|
||||
|
||||
// Calculate the checksum for the current internal state of the remote.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::checksum() {
|
||||
uint8_t sum = 0;
|
||||
// Checksum is simple addition of all previous bytes stored
|
||||
// as a 8 bit value.
|
||||
for (uint8_t i = 0; i < 17; i++)
|
||||
sum += remote_state[i];
|
||||
remote_state[17] = sum & 0xFFU;
|
||||
}
|
||||
|
||||
// Set the requested power state of the A/C to off.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::on() {
|
||||
//state = ON;
|
||||
remote_state[5] |= MITSUBISHI_AC_POWER;
|
||||
}
|
||||
|
||||
// Set the requested power state of the A/C to off.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::off() {
|
||||
//state = OFF;
|
||||
remote_state[5] &= ~MITSUBISHI_AC_POWER;
|
||||
}
|
||||
|
||||
// Set the requested power state of the A/C.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::setPower(bool state) {
|
||||
if (state)
|
||||
on();
|
||||
else
|
||||
off();
|
||||
}
|
||||
|
||||
// Return the requested power state of the A/C.
|
||||
bool ICACHE_FLASH_ATTR IRMitsubishiAC::getPower() {
|
||||
return((remote_state[5] & MITSUBISHI_AC_POWER) != 0);
|
||||
}
|
||||
|
||||
// Set the temp. in deg C
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::setTemp(uint8_t temp) {
|
||||
temp = max(static_cast<uint8_t>(MITSUBISHI_AC_MIN_TEMP), temp);
|
||||
temp = min(static_cast<uint8_t>(MITSUBISHI_AC_MAX_TEMP), temp);
|
||||
remote_state[7] = temp - MITSUBISHI_AC_MIN_TEMP;
|
||||
}
|
||||
|
||||
// Return the set temp. in deg C
|
||||
uint8_t ICACHE_FLASH_ATTR IRMitsubishiAC::getTemp() {
|
||||
return(remote_state[7] + MITSUBISHI_AC_MIN_TEMP);
|
||||
}
|
||||
|
||||
// Set the speed of the fan, 0-6.
|
||||
// 0 is auto, 1-5 is the speed, 6 is silent.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::setFan(uint8_t fan) {
|
||||
// Bounds check
|
||||
if (fan > MITSUBISHI_AC_FAN_SILENT)
|
||||
fan = MITSUBISHI_AC_FAN_MAX; // Set the fan to maximum if out of range.
|
||||
if (fan == MITSUBISHI_AC_FAN_AUTO) { // Automatic is a special case.
|
||||
remote_state[9] = B10000000 | (remote_state[9] & B01111000);
|
||||
return;
|
||||
} else if (fan >= MITSUBISHI_AC_FAN_MAX) {
|
||||
fan--; // There is no spoon^H^H^Heed 5 (max), pretend it doesn't exist.
|
||||
}
|
||||
remote_state[9] |= fan;
|
||||
}
|
||||
|
||||
// Return the requested state of the unit's fan.
|
||||
uint8_t ICACHE_FLASH_ATTR IRMitsubishiAC::getFan() {
|
||||
uint8_t fan = remote_state[9] & B111;
|
||||
if (fan == MITSUBISHI_AC_FAN_MAX)
|
||||
return MITSUBISHI_AC_FAN_SILENT;
|
||||
return fan;
|
||||
}
|
||||
|
||||
// Return the requested climate operation mode of the a/c unit.
|
||||
uint8_t ICACHE_FLASH_ATTR IRMitsubishiAC::getMode() {
|
||||
/*
|
||||
MITSUBISHI_AC_AUTO
|
||||
MITSUBISHI_AC_COOL
|
||||
MITSUBISHI_AC_DRY
|
||||
MITSUBISHI_AC_HEAT
|
||||
*/
|
||||
return(remote_state[6]);
|
||||
}
|
||||
|
||||
// Set the requested climate operation mode of the a/c unit.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::setMode(uint8_t mode) {
|
||||
// If we get an unexpected mode, default to AUTO.
|
||||
switch (mode) {
|
||||
case MITSUBISHI_AC_AUTO: break;
|
||||
case MITSUBISHI_AC_COOL: break;
|
||||
case MITSUBISHI_AC_DRY: break;
|
||||
case MITSUBISHI_AC_HEAT: break;
|
||||
default: mode = MITSUBISHI_AC_AUTO;
|
||||
}
|
||||
remote_state[6] = mode;
|
||||
}
|
||||
|
||||
// Set the requested vane operation mode of the a/c unit.
|
||||
void ICACHE_FLASH_ATTR IRMitsubishiAC::setVane(uint8_t mode) {
|
||||
mode = max(mode, static_cast<uint8_t>(B111)); // bounds check
|
||||
mode |= B1000;
|
||||
mode <<= 3;
|
||||
remote_state[9] |= mode;
|
||||
}
|
||||
|
||||
// Return the requested vane operation mode of the a/c unit.
|
||||
uint8_t ICACHE_FLASH_ATTR IRMitsubishiAC::getVane() {
|
||||
return ((remote_state[9] & B00111000) >> 3);
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <Arduino.h>
|
||||
|
||||
#define MITSUBISHI_AC_AUTO 0x20U
|
||||
#define MITSUBISHI_AC_COOL 0x18U
|
||||
#define MITSUBISHI_AC_DRY 0x10U
|
||||
#define MITSUBISHI_AC_HEAT 0x08U
|
||||
#define MITSUBISHI_AC_POWER 0x20U
|
||||
#define MITSUBISHI_AC_FAN_AUTO 0U
|
||||
#define MITSUBISHI_AC_FAN_MAX 5U
|
||||
#define MITSUBISHI_AC_FAN_SILENT 6U
|
||||
#define MITSUBISHI_AC_MIN_TEMP 16U // 16C
|
||||
#define MITSUBISHI_AC_MAX_TEMP 31U // 31C
|
||||
#define MITSUBISHI_AC_VANE_AUTO 0U
|
||||
#define MITSUBISHI_AC_VANE_AUTO_MOVE 7U
|
||||
#define MITSUBISHI_AC_STATE_LENGTH 18
|
||||
|
||||
class IRMitsubishiAC
|
||||
{
|
||||
public:
|
||||
IRMitsubishiAC(int pin);
|
||||
|
||||
void stateReset();
|
||||
void send();
|
||||
|
||||
void begin();
|
||||
void on();
|
||||
void off();
|
||||
void setPower(bool state);
|
||||
bool getPower();
|
||||
void setTemp(uint8_t temp);
|
||||
uint8_t getTemp();
|
||||
void setFan(uint8_t fan);
|
||||
uint8_t getFan();
|
||||
void setMode(uint8_t mode);
|
||||
uint8_t getMode();
|
||||
void setVane(uint8_t mode);
|
||||
uint8_t getVane();
|
||||
uint8_t* getRaw();
|
||||
|
||||
|
||||
private:
|
||||
// The state of the IR remote in IR code form.
|
||||
// Known good state obtained from:
|
||||
// https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266.ino#L108
|
||||
uint8_t known_good_state[MITSUBISHI_AC_STATE_LENGTH] = { 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30, 0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F };
|
||||
uint8_t remote_state[MITSUBISHI_AC_STATE_LENGTH];
|
||||
|
||||
void checksum();
|
||||
IRsend _irsend;
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,237 +0,0 @@
|
||||
/***************************************************
|
||||
* IRremote for ESP8266
|
||||
*
|
||||
* Based on the IRremote library for Arduino by Ken Shirriff
|
||||
* Version 0.11 August, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
||||
*
|
||||
* Edited by Mitra to add new controller SANYO
|
||||
*
|
||||
* Interrupt code based on NECIRrcv by Joe Knapp
|
||||
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
|
||||
* Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
|
||||
*
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
|
||||
* LG added by Darryl Smith (based on the JVC protocol)
|
||||
* Whynter A/C ARC-110WD added by Francesco Meschia
|
||||
* Coolix A/C / heatpump added by bakrus
|
||||
* Denon: sendDenon, decodeDenon added by Massimiliano Pinto
|
||||
(from https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp)
|
||||
* Kelvinator A/C and Sherwood added by crankyoldgit
|
||||
* Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for sending IR code on ESP8266
|
||||
* Updated by Sebastien Warin (http://sebastien.warin.fr) for receiving IR code on ESP8266
|
||||
*
|
||||
* Updated by sillyfrog for Daikin, adopted from
|
||||
* (https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/)
|
||||
*
|
||||
* GPL license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#ifndef IRremote_h
|
||||
#define IRremote_h
|
||||
|
||||
#include <stdint.h>
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
// The following are compile-time library options.
|
||||
// If you change them, recompile the library.
|
||||
// If DEBUG is defined, a lot of debugging output will be printed during decoding.
|
||||
// TEST must be defined for the IRtest unittests to work. It will make some
|
||||
// methods virtual, which will be slightly slower, which is why it is optional.
|
||||
//#define DEBUG
|
||||
//#define TEST
|
||||
|
||||
/*
|
||||
* Always add to the end of the list and should never remove entries
|
||||
* or change order. Projects may save the type number for later usage
|
||||
* so numbering should always stay the same.
|
||||
*/
|
||||
enum decode_type_t {
|
||||
UNKNOWN = -1,
|
||||
UNUSED = 0,
|
||||
RC5,
|
||||
RC6,
|
||||
NEC,
|
||||
PIONEER,
|
||||
SONY,
|
||||
PANASONIC,
|
||||
JVC,
|
||||
SAMSUNG,
|
||||
WHYNTER,
|
||||
AIWA_RC_T501,
|
||||
LG,
|
||||
SANYO,
|
||||
MITSUBISHI,
|
||||
DISH,
|
||||
SHARP,
|
||||
COOLIX,
|
||||
DAIKIN,
|
||||
DENON,
|
||||
KELVINATOR,
|
||||
SHERWOOD,
|
||||
MITSUBISHI_AC,
|
||||
RCMM
|
||||
};
|
||||
|
||||
// Results returned from the decoder
|
||||
class decode_results {
|
||||
public:
|
||||
int decode_type; // NEC, SONY, RC5, UNKNOWN
|
||||
union { // This is used for decoding Panasonic and Sharp data
|
||||
unsigned int panasonicAddress;
|
||||
unsigned int sharpAddress;
|
||||
};
|
||||
unsigned long value; // Decoded value
|
||||
int bits; // Number of bits in decoded value
|
||||
volatile unsigned int *rawbuf; // Raw intervals in .5 us ticks
|
||||
int rawlen; // Number of records in rawbuf.
|
||||
bool overflow;
|
||||
};
|
||||
|
||||
// Decoded value for NEC when a repeat code is received
|
||||
#define REPEAT 0xffffffff
|
||||
|
||||
#define SEND_PROTOCOL_NEC case NEC: sendNEC(data, nbits); break;
|
||||
#define SEND_PROTOCOL_PIONEER case PIONEER: sendPioneer(data, nbits, 1, 0ul); break;
|
||||
#define SEND_PROTOCOL_SONY case SONY: sendSony(data, nbits); break;
|
||||
#define SEND_PROTOCOL_RC5 case RC5: sendRC5(data, nbits); break;
|
||||
#define SEND_PROTOCOL_RC6 case RC6: sendRC6(data, nbits); break;
|
||||
#define SEND_PROTOCOL_DISH case DISH: sendDISH(data, nbits); break;
|
||||
#define SEND_PROTOCOL_JVC case JVC: sendJVC(data, nbits, 0); break;
|
||||
#define SEND_PROTOCOL_SAMSUNG case SAMSUNG: sendSAMSUNG(data, nbits); break;
|
||||
#define SEND_PROTOCOL_LG case LG: sendLG(data, nbits); break;
|
||||
#define SEND_PROTOCOL_WHYNTER case WHYNTER: sendWhynter(data, nbits); break;
|
||||
#define SEND_PROTOCOL_COOLIX case COOLIX: sendCOOLIX(data, nbits); break;
|
||||
#define SEND_PROTOCOL_DENON case DENON: sendDenon(data, nbits); break;
|
||||
#define SEND_PROTOCOL_SHERWOOD case SHERWOOD: sendSherwood(data, nbits); break;
|
||||
#define SEND_PROTOCOL_RCMM case RCMM: sendRCMM(data, nbits); break;
|
||||
|
||||
|
||||
// main class for receiving IR
|
||||
class IRrecv
|
||||
{
|
||||
public:
|
||||
IRrecv(int recvpin);
|
||||
bool decode(decode_results *results, irparams_t *save=NULL);
|
||||
void enableIRIn();
|
||||
void disableIRIn();
|
||||
void resume();
|
||||
private:
|
||||
// These are called by decode
|
||||
void copyIrParams(irparams_t *dest);
|
||||
int getRClevel(decode_results *results, int *offset, int *used, int t1);
|
||||
bool decodeNEC(decode_results *results);
|
||||
bool decodeSony(decode_results *results);
|
||||
bool decodeSanyo(decode_results *results);
|
||||
bool decodeMitsubishi(decode_results *results);
|
||||
bool decodeRC5(decode_results *results);
|
||||
bool decodeRC6(decode_results *results);
|
||||
bool decodeRCMM(decode_results *results);
|
||||
bool decodePanasonic(decode_results *results);
|
||||
bool decodeLG(decode_results *results);
|
||||
bool decodeJVC(decode_results *results);
|
||||
bool decodeSAMSUNG(decode_results *results);
|
||||
bool decodeWhynter(decode_results *results);
|
||||
bool decodeHash(decode_results *results);
|
||||
// COOLIX decode is not implemented yet
|
||||
// bool decodeCOOLIX(decode_results *results);
|
||||
bool decodeDaikin(decode_results *results);
|
||||
bool decodeDenon(decode_results *results);
|
||||
int compare(unsigned int oldval, unsigned int newval);
|
||||
uint32_t ticksLow(uint32_t usecs, uint8_t tolerance=TOLERANCE);
|
||||
uint32_t ticksHigh(uint32_t usecs, uint8_t tolerance=TOLERANCE);
|
||||
bool match(uint32_t measured_ticks, uint32_t desired_us,
|
||||
uint8_t tolerance=TOLERANCE);
|
||||
bool matchMark(uint32_t measured_ticks, uint32_t desired_us,
|
||||
uint8_t tolerance=TOLERANCE, int excess=MARK_EXCESS);
|
||||
bool matchSpace(uint32_t measured_ticks, uint32_t desired_us,
|
||||
uint8_t tolerance=TOLERANCE, int excess=MARK_EXCESS);
|
||||
};
|
||||
|
||||
// Only used for testing; can remove virtual for shorter code
|
||||
#ifdef TEST
|
||||
#define VIRTUAL virtual
|
||||
#else
|
||||
#define VIRTUAL
|
||||
#endif
|
||||
|
||||
class IRsend
|
||||
{
|
||||
public:
|
||||
IRsend(int IRsendPin);
|
||||
void begin();
|
||||
void send(int type, unsigned long data, int nbits) {
|
||||
switch (type) {
|
||||
SEND_PROTOCOL_NEC
|
||||
SEND_PROTOCOL_PIONEER
|
||||
SEND_PROTOCOL_SONY
|
||||
SEND_PROTOCOL_RC5
|
||||
SEND_PROTOCOL_RC6
|
||||
SEND_PROTOCOL_DISH
|
||||
SEND_PROTOCOL_JVC
|
||||
SEND_PROTOCOL_SAMSUNG
|
||||
SEND_PROTOCOL_LG
|
||||
SEND_PROTOCOL_WHYNTER
|
||||
SEND_PROTOCOL_COOLIX
|
||||
SEND_PROTOCOL_DENON
|
||||
SEND_PROTOCOL_SHERWOOD
|
||||
SEND_PROTOCOL_RCMM
|
||||
}
|
||||
};
|
||||
void sendCOOLIX(unsigned long data, int nbits);
|
||||
void sendWhynter(unsigned long data, int nbits);
|
||||
void sendNEC(unsigned long data, int nbits=32, unsigned int repeat=0);
|
||||
void sendPioneer(unsigned long data, int nbits=32, unsigned int repeat=0, unsigned long secondData=0ul);
|
||||
void sendLG(unsigned long data, int nbits=28, unsigned int repeat=0);
|
||||
// sendSony() should typically be called with repeat=2 as Sony devices
|
||||
// expect the code to be sent at least 3 times. (code + 2 repeats = 3 codes)
|
||||
// As the legacy use of this procedure was only to send a single code
|
||||
// it defaults to repeat=0 for backward compatiblity.
|
||||
void sendSony(unsigned long data, int nbits, unsigned int repeat=0);
|
||||
// Neither Sanyo nor Mitsubishi send is implemented yet
|
||||
// void sendSanyo(unsigned long data, int nbits);
|
||||
// void sendMitsubishi(unsigned long data, int nbits);
|
||||
void sendRaw(unsigned int buf[], int len, int hz);
|
||||
void sendGC(unsigned int buf[], int len);
|
||||
void sendRC5(unsigned long data, int nbits);
|
||||
void sendRC6(unsigned long data, int nbits);
|
||||
void sendRCMM(uint32_t data, uint8_t nbits=24);
|
||||
// sendDISH() should typically be called with repeat=3 as DISH devices
|
||||
// expect the code to be sent at least 4 times. (code + 3 repeats = 4 codes)
|
||||
// As the legacy use of this procedure was only to send a single code
|
||||
// it defaults to repeat=0 for backward compatiblity.
|
||||
void sendDISH(unsigned long data, int nbits, unsigned int repeat=0);
|
||||
void sendSharp(unsigned int address, unsigned int command);
|
||||
void sendSharpRaw(unsigned long data, int nbits);
|
||||
void sendPanasonic(unsigned int address, unsigned long data);
|
||||
void sendJVC(unsigned long data, int nbits, unsigned int repeat=0);
|
||||
void sendSAMSUNG(unsigned long data, int nbits=32);
|
||||
void sendDaikin(unsigned char data[]);
|
||||
void sendDenon(unsigned long data, int nbits=14);
|
||||
void sendKelvinator(unsigned char data[]);
|
||||
void sendSherwood(unsigned long data, int nbits=32, unsigned int repeat=1);
|
||||
void sendMitsubishiAC(unsigned char data[]);
|
||||
void enableIROut(int khz);
|
||||
VIRTUAL void mark(unsigned int usec);
|
||||
VIRTUAL void space(unsigned long usec);
|
||||
private:
|
||||
int halfPeriodicTime;
|
||||
int IRpin;
|
||||
void sendMitsubishiACChunk(unsigned char data);
|
||||
void sendData(uint16_t onemark, uint32_t onespace,
|
||||
uint16_t zeromark, uint32_t zerospace,
|
||||
uint32_t data, uint8_t nbits, bool MSBfirst=true);
|
||||
void ledOff();
|
||||
} ;
|
||||
|
||||
class IRtimer {
|
||||
public:
|
||||
IRtimer();
|
||||
void reset();
|
||||
uint32_t elapsed();
|
||||
private:
|
||||
uint32_t start;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,267 +0,0 @@
|
||||
/***************************************************
|
||||
* IRremote for ESP8266
|
||||
*
|
||||
* Based on the IRremote library for Arduino by Ken Shirriff
|
||||
* Version 0.11 August, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
||||
*
|
||||
* Modified by Paul Stoffregen <paul@pjrc.com> to support other boards and timers
|
||||
*
|
||||
* Interrupt code based on NECIRrcv by Joe Knapp
|
||||
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
|
||||
* Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
|
||||
*
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
|
||||
* Whynter A/C ARC-110WD added by Francesco Meschia
|
||||
* Coolix A/C / heatpump added by bakrus
|
||||
* Denon: sendDenon, decodeDenon added by Massimiliano Pinto
|
||||
(from https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp)
|
||||
* Kelvinator A/C added by crankyoldgit
|
||||
* Mitsubishi A/C added by crankyoldgit
|
||||
* (based on https://github.com/r45635/HVAC-IR-Control)
|
||||
*
|
||||
* 09/23/2015 : Samsung pulse parameters updated by Sebastien Warin to be compatible with EUxxD6200
|
||||
*
|
||||
* GPL license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#ifndef IRremoteint_h
|
||||
#define IRremoteint_h
|
||||
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
// Pulse parms are *50-100 for the Mark and *50+100 for the space
|
||||
// First MARK is the one after the long gap
|
||||
// pulse parameters in usec
|
||||
#define COOLIX_BIT_MARK 560 // Approximately 21 cycles at 38kHz
|
||||
#define COOLIX_ONE_SPACE COOLIX_BIT_MARK * 3
|
||||
#define COOLIX_ZERO_SPACE COOLIX_BIT_MARK * 1
|
||||
#define COOLIX_HDR_MARK COOLIX_BIT_MARK * 8
|
||||
#define COOLIX_HDR_SPACE COOLIX_BIT_MARK * 8
|
||||
|
||||
#define WHYNTER_HDR_MARK 2850
|
||||
#define WHYNTER_HDR_SPACE 2850
|
||||
#define WHYNTER_BIT_MARK 750
|
||||
#define WHYNTER_ONE_MARK 750
|
||||
#define WHYNTER_ONE_SPACE 2150
|
||||
#define WHYNTER_ZERO_MARK 750
|
||||
#define WHYNTER_ZERO_SPACE 750
|
||||
|
||||
#define NEC_HDR_MARK 9000
|
||||
#define NEC_HDR_SPACE 4500
|
||||
#define NEC_BIT_MARK 560
|
||||
#define NEC_ONE_SPACE 1690
|
||||
#define NEC_ZERO_SPACE 560
|
||||
#define NEC_RPT_SPACE 2250
|
||||
#define NEC_MIN_COMMAND_LENGTH 108000UL
|
||||
|
||||
#define PIONEER_HDR_MARK 8000
|
||||
#define PIONEER_HDR_SPACE 4000
|
||||
#define PIONEER_BIT_MARK 500
|
||||
#define PIONEER_ONE_SPACE 1500
|
||||
#define PIONEER_ZERO_SPACE 500
|
||||
#define PIONEER_RPT_SPACE 2250
|
||||
#define PIONEER_MIN_COMMAND_LENGTH 90000UL
|
||||
|
||||
// Timings based on http://www.sbprojects.com/knowledge/ir/sirc.php
|
||||
#define SONY_HDR_MARK 2400
|
||||
#define SONY_HDR_SPACE 600
|
||||
#define SONY_ONE_MARK 1250 // Experiments suggest +50 to spec is better.
|
||||
#define SONY_ZERO_MARK 650 // Experiments suggest +50 to spec is better.
|
||||
#define SONY_RPT_LENGTH 45000
|
||||
#define SONY_DOUBLE_SPACE_USECS 500 // usually see 713 - not using ticks as get number wrapround
|
||||
|
||||
// SA 8650B
|
||||
#define SANYO_HDR_MARK 3500 // seen range 3500
|
||||
#define SANYO_HDR_SPACE 950 // seen 950
|
||||
#define SANYO_ONE_MARK 2400 // seen 2400
|
||||
#define SANYO_ZERO_MARK 700 // seen 700
|
||||
#define SANYO_DOUBLE_SPACE_USECS 800 // usually see 713 - not using ticks as get number wrapround
|
||||
#define SANYO_RPT_LENGTH 45000
|
||||
|
||||
// Mitsubishi RM 75501
|
||||
// 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7
|
||||
|
||||
// #define MITSUBISHI_HDR_MARK 250 // seen range 3500
|
||||
#define MITSUBISHI_HDR_SPACE 350 // 7*50+100
|
||||
#define MITSUBISHI_ONE_MARK 1950 // 41*50-100
|
||||
#define MITSUBISHI_ZERO_MARK 750 // 17*50-100
|
||||
// #define MITSUBISHI_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround
|
||||
// #define MITSUBISHI_RPT_LENGTH 45000
|
||||
|
||||
// Mitsubishi A/C
|
||||
// Values were initially obtained from:
|
||||
// https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266.ino#L84
|
||||
#define MITSUBISHI_AC_HDR_MARK 3400
|
||||
#define MITSUBISHI_AC_HDR_SPACE 1750
|
||||
#define MITSUBISHI_AC_BIT_MARK 450
|
||||
#define MITSUBISHI_AC_ONE_SPACE 1300
|
||||
#define MITSUBISHI_AC_ZERO_SPACE 420
|
||||
#define MITSUBISHI_AC_RPT_MARK 440
|
||||
#define MITSUBISHI_AC_RPT_SPACE 17100L
|
||||
|
||||
|
||||
#define RC5_T1 889
|
||||
#define RC5_RPT_LENGTH 46000
|
||||
|
||||
#define RC6_HDR_MARK 2666
|
||||
#define RC6_HDR_SPACE 889
|
||||
#define RC6_T1 444
|
||||
#define RC6_RPT_LENGTH 46000
|
||||
|
||||
// http://www.sbprojects.com/knowledge/ir/rcmm.php
|
||||
#define RCMM_HDR_MARK 416
|
||||
#define RCMM_HDR_SPACE 277
|
||||
#define RCMM_BIT_MARK 166
|
||||
#define RCMM_BIT_SPACE_0 277
|
||||
#define RCMM_BIT_SPACE_1 444
|
||||
#define RCMM_BIT_SPACE_2 611
|
||||
#define RCMM_BIT_SPACE_3 777
|
||||
#define RCMM_RPT_LENGTH 27778
|
||||
#define RCMM_MIN_GAP 3360
|
||||
// Use a tolerance of +/-10% when matching some data spaces.
|
||||
#define RCMM_TOLERANCE 10
|
||||
#define RCMM_EXCESS 50
|
||||
|
||||
#define SHARP_BIT_MARK 245
|
||||
#define SHARP_ONE_SPACE 1805
|
||||
#define SHARP_ZERO_SPACE 795
|
||||
#define SHARP_GAP 600000
|
||||
#define SHARP_TOGGLE_MASK 0x3FF
|
||||
#define SHARP_RPT_SPACE 3000
|
||||
|
||||
#define DISH_HDR_MARK 400
|
||||
#define DISH_HDR_SPACE 6100
|
||||
#define DISH_BIT_MARK 400
|
||||
#define DISH_ONE_SPACE 1700
|
||||
#define DISH_ZERO_SPACE 2800
|
||||
#define DISH_RPT_SPACE 6200
|
||||
|
||||
// Ref: http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?26152
|
||||
#define PANASONIC_HDR_MARK 3456
|
||||
#define PANASONIC_HDR_SPACE 1728
|
||||
#define PANASONIC_BIT_MARK 432
|
||||
#define PANASONIC_ONE_SPACE 1296
|
||||
#define PANASONIC_ZERO_SPACE 432
|
||||
|
||||
#define JVC_HDR_MARK 8000
|
||||
#define JVC_HDR_SPACE 4000
|
||||
#define JVC_BIT_MARK 600
|
||||
#define JVC_ONE_SPACE 1600
|
||||
#define JVC_ZERO_SPACE 550
|
||||
#define JVC_RPT_LENGTH 60000
|
||||
|
||||
#define LG_HDR_MARK 8000
|
||||
#define LG_HDR_SPACE 4000
|
||||
#define LG_BIT_MARK 600
|
||||
#define LG_ONE_SPACE 1600
|
||||
#define LG_ZERO_SPACE 550
|
||||
#define LG_RPT_LENGTH 60000
|
||||
|
||||
/*
|
||||
#define SAMSUNG_HDR_MARK 5000
|
||||
#define SAMSUNG_HDR_SPACE 5000
|
||||
#define SAMSUNG_BIT_MARK 560
|
||||
#define SAMSUNG_ONE_SPACE 1600
|
||||
#define SAMSUNG_ZERO_SPACE 560
|
||||
#define SAMSUNG_RPT_SPACE 2250
|
||||
*/
|
||||
|
||||
// Update by Sebastien Warin for my EU46D6200
|
||||
#define SAMSUNG_HDR_MARK 4500
|
||||
#define SAMSUNG_HDR_SPACE 4500
|
||||
#define SAMSUNG_BIT_MARK 590
|
||||
#define SAMSUNG_ONE_SPACE 1690
|
||||
#define SAMSUNG_ZERO_SPACE 590
|
||||
#define SAMSUNG_RPT_SPACE 2250
|
||||
|
||||
#define SHARP_BITS 15
|
||||
#define DISH_BITS 16
|
||||
|
||||
// Daikin, from https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
|
||||
#define DAIKIN_HDR_MARK 3650 //DAIKIN_ZERO_MARK*8
|
||||
#define DAIKIN_HDR_SPACE 1623 //DAIKIN_ZERO_MARK*4
|
||||
#define DAIKIN_ONE_SPACE 1280
|
||||
#define DAIKIN_ONE_MARK 428
|
||||
#define DAIKIN_ZERO_MARK 428
|
||||
#define DAIKIN_ZERO_SPACE 428
|
||||
|
||||
//Denon, from https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp
|
||||
#define DENON_BITS 14 // The number of bits in the command
|
||||
#define DENON_HDR_MARK 300 // The length of the Header:Mark
|
||||
#define DENON_HDR_SPACE 750 // The lenght of the Header:Space
|
||||
#define DENON_BIT_MARK 300 // The length of a Bit:Mark
|
||||
#define DENON_ONE_SPACE 1800 // The length of a Bit:Space for 1's
|
||||
#define DENON_ZERO_SPACE 750 // The length of a Bit:Space for 0's
|
||||
|
||||
#define KELVINATOR_HDR_MARK 8990U
|
||||
#define KELVINATOR_HDR_SPACE 4490U
|
||||
#define KELVINATOR_BIT_MARK 675U
|
||||
#define KELVINATOR_ONE_SPACE 1560U
|
||||
#define KELVINATOR_ZERO_SPACE 520U
|
||||
#define KELVINATOR_GAP_SPACE 19950U
|
||||
#define KELVINATOR_CMD_FOOTER 2U
|
||||
|
||||
// Some useful constants
|
||||
#define USECPERTICK 50 // microseconds per clock interrupt tick
|
||||
#define RAWBUF 100 // Length of raw duration buffer
|
||||
|
||||
// Marks tend to be 100us too long, and spaces 100us too short
|
||||
// when received due to sensor lag.
|
||||
#define MARK_EXCESS 100
|
||||
|
||||
#define _GAP 5000 // Minimum map between transmissions
|
||||
#define GAP_TICKS (_GAP/USECPERTICK)
|
||||
|
||||
#define TOLERANCE 25 // default percent tolerance in measurements
|
||||
|
||||
// receiver states
|
||||
#define STATE_IDLE 2
|
||||
#define STATE_MARK 3
|
||||
#define STATE_SPACE 4
|
||||
#define STATE_STOP 5
|
||||
|
||||
#define RAWBUF 100 // Length of raw duration buffer
|
||||
|
||||
// information for the interrupt handler
|
||||
typedef struct {
|
||||
uint8_t recvpin; // pin for IR data from detector
|
||||
uint8_t rcvstate; // state machine
|
||||
unsigned int timer; // state timer, counts 50uS ticks.
|
||||
unsigned int rawbuf[RAWBUF]; // raw data
|
||||
// uint16_t is used for rawlen as it saves 3 bytes of iram in the interrupt
|
||||
// handler. Don't ask why, I don't know. It just does.
|
||||
uint16_t rawlen; // counter of entries in rawbuf.
|
||||
uint8_t overflow; // Buffer overflow indicator.
|
||||
}
|
||||
irparams_t;
|
||||
|
||||
// Defined in IRremote.cpp
|
||||
extern volatile irparams_t irparams;
|
||||
|
||||
// IR detector output is active low
|
||||
#define MARK 0
|
||||
#define SPACE 1
|
||||
|
||||
#define TOPBIT 0x80000000
|
||||
|
||||
#define NEC_BITS 32
|
||||
#define SONY_BITS 12
|
||||
#define SANYO_BITS 12
|
||||
#define MITSUBISHI_BITS 16
|
||||
#define MIN_RC5_SAMPLES 11
|
||||
#define MIN_RC6_SAMPLES 1
|
||||
#define PANASONIC_BITS 48
|
||||
#define JVC_BITS 16
|
||||
#define LG_BITS 28
|
||||
#define SAMSUNG_BITS 32
|
||||
#define WHYNTER_BITS 32
|
||||
#define COOLIX_NBYTES 3
|
||||
#define DAIKIN_BITS 99
|
||||
|
||||
#endif
|
||||
@@ -1,38 +1,78 @@
|
||||
# IRremote ESP8266 Library
|
||||
|
||||
[](https://travis-ci.org/markszabo/IRremoteESP8266)
|
||||
[](http://isitmaintained.com/project/markszabo/IRremoteESP8266 "Average time to resolve an issue")
|
||||
[](http://isitmaintained.com/project/markszabo/IRremoteESP8266 "Percentage of issues still open")
|
||||
[](https://gitlicense.com/license/markszabo/IRremoteESP8266)
|
||||
|
||||
This library enables you to **send and receive** infra-red signals on an ESP8266 using Arduino framework (https://github.com/esp8266/Arduino)
|
||||
This library enables you to **send _and_ receive** infra-red signals on an [ESP8266 using the Arduino framework](https://github.com/esp8266/Arduino) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* etc.
|
||||
|
||||
This library is based on Ken Shirriff's work (https://github.com/shirriff/Arduino-IRremote/)
|
||||
## v2.5.2 Now Available
|
||||
Version 2.5.2 of the library is now [available](https://github.com/markszabo/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes.
|
||||
|
||||
[Mark Szabo](https://github.com/markszabo/IRremoteESP8266) has updated the IRsend class to work on ESP8266 and [Sebastien Warin](https://github.com/sebastienwarin/IRremoteESP8266) the receiving & decoding part (IRrecv class).
|
||||
#### Upgrading from pre-v2.0
|
||||
Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/markszabo/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.
|
||||
|
||||
Seb's notes : I also changed the pulse parameters for Samsung, update the Panasonic and Samsung decoders and remove the SANYO decoders. The IR decoder was successfully tested with Panasonic and Samsung remote controls.
|
||||
#### Upgrading from pre-v2.5
|
||||
The library has changed from using constants declared as `#define` to
|
||||
[const](https://google.github.io/styleguide/cppguide.html#Constant_Names) with
|
||||
the appropriate naming per the
|
||||
[C++ style guide](https://google.github.io/styleguide/cppguide.html).
|
||||
This may potentially cause old programs to not compile.
|
||||
The most likely externally used `#define`s have been _aliased_ for limited
|
||||
backward compatibility for projects using the old style. Going forward, only the
|
||||
new `kConstantName` style will be supported for new protocol additions.
|
||||
|
||||
In the unlikely case it does break your code, then you may have been referencing
|
||||
something you likely should not have. You should be able to quickly determine
|
||||
the new name from the old. e.g. `CONSTANT_NAME` to `kConstantName`.
|
||||
Use common sense or examining the library's code if this does affect code.
|
||||
|
||||
## Troubleshooting
|
||||
Before reporting an issue or asking for help, please try to follow our [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide) first.
|
||||
|
||||
## Frequently Asked Questions
|
||||
Some common answers to common questions and problems are on our [F.A.Q. wiki page](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions).
|
||||
|
||||
## Installation
|
||||
1. Click "Download ZIP"
|
||||
2. Extract the downloaded zip file
|
||||
3. Rename the extracted folder to "IRremoteESP8266"
|
||||
4. Move this folder to your libraries directory (under windows: C:\Users\YOURNAME\Documents\Arduino\libraries\)
|
||||
5. Restart your Arduino ide
|
||||
6. Check out the examples
|
||||
##### Official releases via the Arduino IDE v1.8+ (Windows & Linux)
|
||||
1. Click the _"Sketch"_ -> _"Include Library"_ -> _"Manage Libraries..."_ Menu items.
|
||||
1. Enter `IRremoteESP8266` into the _"Filter your search..."_ top right search box.
|
||||
1. Click on the IRremoteESP8266 result of the search.
|
||||
1. Select the version you wish to install and click _"Install"_.
|
||||
|
||||
###### Using Git to install library ( Linux )
|
||||
##### Manual Installation for Windows
|
||||
1. Click on _"Clone or Download"_ button, then _"[Download ZIP](https://github.com/markszabo/IRremoteESP8266/archive->master.zip)"_ on the page.
|
||||
1. Extract the contents of the downloaded zip file.
|
||||
1. Rename the extracted folder to _"IRremoteESP8266"_.
|
||||
1. Move this folder to your libraries directory. (under windows: `C:\Users\YOURNAME\Documents\Arduino\libraries\`)
|
||||
1. Restart your Arduino IDE.
|
||||
1. Check out the examples.
|
||||
|
||||
##### Using Git to install library ( Linux )
|
||||
```
|
||||
cd ~/Arduino/libraries
|
||||
git clone https://github.com/markszabo/IRremoteESP8266.git
|
||||
```
|
||||
###### To Update to the latest version of the library
|
||||
`
|
||||
```
|
||||
cd ~/Arduino/libraries/IRremoteESP8266 && git pull
|
||||
`
|
||||
```
|
||||
|
||||
## Contributing
|
||||
If you want to contribute to this project:
|
||||
- Report bugs and errors
|
||||
If you want to [contribute](.github/CONTRIBUTING.md#how-can-i-contribute) to this project, consider:
|
||||
- [Report](.github/CONTRIBUTING.md#reporting-bugs) bugs and errors
|
||||
- Ask for enhancements
|
||||
- Create issues and pull requests
|
||||
- Improve our documentation
|
||||
- [Create issues](.github/CONTRIBUTING.md#reporting-bugs) and [pull requests](.github/CONTRIBUTING.md#pull-requests)
|
||||
- Tell other people about this library
|
||||
|
||||
## Contributors
|
||||
Check [here](Contributors.md)
|
||||
Available [here](.github/Contributors.md)
|
||||
|
||||
## Library History
|
||||
This library was originally based on Ken Shirriff's work (https://github.com/shirriff/Arduino-IRremote/)
|
||||
|
||||
[Mark Szabo](https://github.com/markszabo/IRremoteESP8266) has updated the IRsend class to work on ESP8266 and [Sebastien Warin](https://github.com/sebastienwarin/IRremoteESP8266) the receiving & decoding part (IRrecv class).
|
||||
|
||||
As of v2.0, the library was almost entirely re-written with the ESP8266's resources in mind.
|
||||
|
||||
@@ -0,0 +1,308 @@
|
||||
# Release Notes
|
||||
|
||||
## _v2.5.2 (20181021)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Add missing send() method to IRPanasonicAC class. (#545)
|
||||
- Add missing sendWhirlpoolAC() to IRMQTTServer.ino (#558)
|
||||
|
||||
**[Features]**
|
||||
- Add IR receiving support to IRMQTTServer. (#543)
|
||||
- Pioneer support (#547)
|
||||
- Add support for a second LG protocol variant. (#552)
|
||||
- Support for short Panasonic A/C messages. (#553)
|
||||
- Add support for Panasonic CKP series A/Cs. (#554)
|
||||
- Experimental timer/clock support for Panasonic A/Cs. (#546)
|
||||
- Add Made With Magic (MWM) support (#557)
|
||||
|
||||
**[Misc]**
|
||||
- Grammar and typo fixes (#541, #549)
|
||||
- Increase Panasonic A/C message tolerances. (#542)
|
||||
- Added command mode2_decode in tools/ (#557)
|
||||
- General code style cleanup (#560)
|
||||
|
||||
|
||||
## _v2.5.1 (20181002)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Correct the byte used for Samsung AC Swing. (#529)
|
||||
- Fix not sending Samsung A/C messages in IRMQTTServer. (#529)
|
||||
|
||||
**[Features]**
|
||||
- Experimental support for Electra A/C messages. (#528)
|
||||
- Experimental support for Panasonic A/C messages. (#535)
|
||||
- Samsung A/C fixes & improvements (#529)
|
||||
- IRMQTTServer v0.6.0 (#530)
|
||||
|
||||
**[Misc]**
|
||||
- Change required WifiManager lib version to v0.14
|
||||
- Add alias for RAWTICK to kRawTick. (#535)
|
||||
- Update sendLutron() status. (#515)
|
||||
- Remove leftover debug message in IRrecvDumpV2 (#526)
|
||||
|
||||
|
||||
## _v2.5.0 (20180919)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Fix HTML menu error for GICABLE in IRMQTTServer. (#516)
|
||||
- Fix Mitsubishi A/C mode setting. (#514)
|
||||
- Add missing ',' in auto analyse tool generated code. (#513)
|
||||
- Fix Fujitsu checksum validation. (#501)
|
||||
- Remove errant Repeat debug statement in IRMQTTServer. (#507)
|
||||
|
||||
**[Features]**
|
||||
- Mitsubishi A/C decode improvements. (#514)
|
||||
- Basic support for Whirlpool A/C messages. (#511)
|
||||
- Basic support for Samsung A/C messages. (#512)
|
||||
- Experimental support for detailed Samsung A/C messages. (#521)
|
||||
- Experimental support for detailed Coolix A/C messages. (#518)
|
||||
- Experimental support for Lutron protocol. (#516)
|
||||
- Calculate and use average values for timings in analysing tool. (#513)
|
||||
|
||||
**[Misc]**
|
||||
- Style change from using #define's for constants to `const kConstantName`.
|
||||
- Improve the JVC example code.
|
||||
|
||||
|
||||
## _v2.4.3 (20180727)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Handle Space Gaps better in auto analyse tool. (#482)
|
||||
- Correct min repeat for GICABLE in IRMQTTServer. (#494)
|
||||
|
||||
**[Features]**
|
||||
- Add static IP config option to IRMQTTServer (#480)
|
||||
- Full decoding/encoding support for the Haier YRW02 A/C. (#485 #486 #487)
|
||||
|
||||
**[Misc]**
|
||||
- Update LG (28-bit) HDR mark and space timings. (#492)
|
||||
- Spelling and grammar fixes (#491)
|
||||
|
||||
|
||||
## _v2.4.2 (20180601)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Timing Fix: Update the period offset compensation.
|
||||
|
||||
**[Features]**
|
||||
- Improvements for IRMQTTServer example (#466)
|
||||
|
||||
|
||||
## _v2.4.1 (20180520)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Fix crash in IRMQTTServer when compiled under Arduino IDE. (#455)
|
||||
- Default bit length not set for RCMM in IRMQTTServer example. (#456)
|
||||
- Bad acknowledgements for some A/C protocols in IRMQTTServer example. (#460)
|
||||
|
||||
**[Features]**
|
||||
- Allow disabling the use of delay() calls. (#450)
|
||||
- Initial support for G.I. Cable protocol. (#458)
|
||||
- Support of Hitachi A/C 13 & 53 byte messages. (#461)
|
||||
|
||||
**[Misc]**
|
||||
- Auto Analyse Raw Data script converted to Python. (#454)
|
||||
|
||||
## _v2.4.0 (20180407)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Add missing WiFi.begin() call to IRGCTCPServer example. (#433)
|
||||
- Add missing sendHaierAC() to IRMQTTServer example. (#434 & #444)
|
||||
- Make mqtt clientid unique in IRMQTTServer example. (#444)
|
||||
|
||||
**[Features]**
|
||||
|
||||
- Initial Mitsubishi projector protocol support. (#442)
|
||||
- Experimental support of Hitachi A/C messages. (#445)
|
||||
- Improve transmission pulse modulation support.
|
||||
Allow disabling of transmission frequency modulation.(#439)
|
||||
|
||||
**[Misc]**
|
||||
- IRMQTTServer example improvements. (#444)
|
||||
|
||||
|
||||
## _v2.3.3 (20180302)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Ensure the IR LED is off before we start. (#405)
|
||||
|
||||
**[Features]**
|
||||
- Experimental decode support for Gree HVAC units (#397)
|
||||
- Initial support for Haier A/Cs. (#409)
|
||||
- Improve timing accuracy of unit tests. (#403)
|
||||
- Rework matchData() to handle equal total data bit time protocols. (#408)
|
||||
|
||||
**[Misc]**
|
||||
- Add startup text to IRrecvDumpV2 and IRrecvDemo (#412)
|
||||
- Tweak timings on Fujitsu A/C header (#418)
|
||||
- AutoAnalyseRawData.sh: Add some support for handling larger than 64 bit codes. (#419)
|
||||
- Use better comments for send GPIO in examples. (#425)
|
||||
|
||||
|
||||
## _v2.3.2 (20180126)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Integer underflow caused device not to respond in `sendJVC()` (#401)
|
||||
|
||||
**[Features]**
|
||||
- Initial support for sending & receiving Carrier HVAC codes. (#387)
|
||||
- Add Pronto HEX code support to _gc_decode_ tool. (#388)
|
||||
|
||||
**[Misc]**
|
||||
- Make mDNS independent of MQTT in IRMQTTServer example code. (#390 #391)
|
||||
|
||||
|
||||
## _v2.3.1 (20171229)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Setting `#define SEND_FUJITSU_AC false` caused a compilation error (#375)
|
||||
- Integer underflow caused huge `space()` in `sendGeneric()` (#381)
|
||||
|
||||
**[Features]**
|
||||
- Support sending & receiving Lasertag codes. (#374)
|
||||
- Reduce the library footprint by using a new `sendGeneric()` routine. (#373)
|
||||
|
||||
**[Misc]**
|
||||
- Lots of grammar & typo fixes. (#378)
|
||||
- Update keywords.txt for Arduino IDE users (#371)
|
||||
- Update pins in examples so they are compatible with Adafruit boards. (#383)
|
||||
|
||||
|
||||
## _v2.3.0 (20171208)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Panasonic-based protocols had incorrect message gap. (#358)
|
||||
- Formatting error for large rawData values in example code. (#355)
|
||||
- Off-by-one error in payload_copy malloc. (#337)
|
||||
- Off-by-one error in unit test helper routines (#363)
|
||||
|
||||
**[Features]**
|
||||
- Support sending and receiving Midea A/C codes.
|
||||
- Support for receiving Kelvinator A/C codes. (#332)
|
||||
- Support more operation features for Daikin A/Cs.
|
||||
- Support for decoding Daikin A/Cs.
|
||||
- Support sending and receiving Toshiba A/Cs. (#333)
|
||||
- Support sending and receiving AR-DB1 Fujitsu A/C codes. (#367)
|
||||
- Add new AutoAnalyseRawData.sh & RawToGlobalCache.sh tools (#345) (#343)
|
||||
- Support for MagiQuest wands. (#365)
|
||||
|
||||
**[Misc]**
|
||||
- Add checksum verification to Kelvinator A/C decodes. (#348)
|
||||
- Changes to the threshold reporting of UNKNOWN messages (#347)
|
||||
- Major re-work of Daikin A/C support.
|
||||
- Sending for all A/Cs added to MQTT example code.
|
||||
- MQTT example code improvements. (#334)
|
||||
- IRrecvDumpV2 significant output improvements. (#363)
|
||||
- Improved unit test coverage for the library.
|
||||
|
||||
|
||||
## _v2.2.1 (20171025)_
|
||||
|
||||
**[Features]**
|
||||
- Support for sending and decoding Nikai TV messages. (#311, #313)
|
||||
- gc_decode: External utility to decode Global Cache codes. (#308, #312)
|
||||
- IRMQTTServer: Example code to send IR messages via HTTP & MQTT. (#316, #323)
|
||||
- Improve converting 64bit values to hexadecimal. (#318)
|
||||
|
||||
**[Misc]**
|
||||
- IRrecvDump.ino code is now deprecated. Use IRrecvDumpV2.ino instead. (#314)
|
||||
|
||||
|
||||
## _v2.2.0 (20170922)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- Add printing output of RC-MM and RC-5X protocols in example code. (#284)
|
||||
- LG timing improvements based on observations (#291)
|
||||
|
||||
**[Features]**
|
||||
- Automatic capture timing calibration for some protocols. (#268)
|
||||
- Support for creating & sending Trotec AC codes. (#279)
|
||||
- Support for creating & sending Argo Ulisse 13 DCI codes. (#280 #300)
|
||||
- Move to 2 microsecond timing resolution for capture of codes. (#287)
|
||||
- Capture buffer changes:
|
||||
- Size at runtime. (#276)
|
||||
- Message timeout at runtime. (#294)
|
||||
- Simplify creating & using a second buffer (#303)
|
||||
- New example code:
|
||||
- Trotec A/C (#279)
|
||||
- LG A/C units (#289)
|
||||
- Argo Ulisse 13 DCI codes. (#300)
|
||||
|
||||
|
||||
## _v2.1.1 (20170711)_
|
||||
|
||||
**[Bug Fixes]**
|
||||
- GlobalCache incorrectly using hardware offset for period calc. (#267)
|
||||
|
||||
**[Features]**
|
||||
- Support reporting of 'NEC'-like 32-bit protocols. e.g. Apple TV remote (#265)
|
||||
- Add an example of sendRaw() to IRsendDemo.ino (#270)
|
||||
|
||||
|
||||
## _v2.1.0 (20170704)_
|
||||
|
||||
**[Features]**
|
||||
- Support for sending Pronto IR codes. (#248)
|
||||
- Support for sending Fujitsu A/C codes. (#88)
|
||||
- Minor improvements to examples.
|
||||
|
||||
|
||||
## _v2.0.3 (20170618)_
|
||||
|
||||
**[Bug fixes]**
|
||||
- Capture buffer could become corrupt after large message, breaking subsequent decodes. (#253)
|
||||
|
||||
|
||||
## _v2.0.2 (20170615)_
|
||||
|
||||
**[Bug fixes]**
|
||||
- Correct decode issue introduced in v2.0.1 affecting multiple protocol decoders (#243)
|
||||
- Correct post-message gap for the Panasonic protocol(s) (#245)
|
||||
- Incorrect display of the decoded uint64_t value in the example code. (#245)
|
||||
|
||||
|
||||
## _v2.0.1 (20170614)_
|
||||
|
||||
**[Bug fixes]**
|
||||
- Decoding protocols when it doesn't detect a post-command gap, and there is no more data. (#243)
|
||||
- Incorrect minimum size calculation when there is no post-command gap. (#243)
|
||||
|
||||
|
||||
## _v2.0.0 - 64 bit support and major improvements (20170612)_
|
||||
|
||||
**[Misc]**
|
||||
- This is almost a complete re-write of the library.
|
||||
|
||||
**[Features]**
|
||||
- All suitable protocols now handle 64-bit data messages and are repeatable via an optional argument.
|
||||
- Unit tests for all protocols.
|
||||
- Far better and stricter decoding for most protocols.
|
||||
- Address & command decoding for protocols where that information is available.
|
||||
- Much more precise timing for generation of signals sent.
|
||||
- Lower duty-cycles for some protocols.
|
||||
- Several new protocols added, and some new sending and decoding routines for existing ones.
|
||||
- Ability to optionally chose which protocols are included, enabling faster decoding and smaller code footprints if desired.
|
||||
- Support for far larger capture buffers. (e.g. RAWLEN > 256)
|
||||
|
||||
**[Bug fixes]**
|
||||
- Numerous bug fixes.
|
||||
|
||||
|
||||
## _v1.2.0 (20170429)_
|
||||
|
||||
**[Features]**
|
||||
- Add ability to copy IR capture buffer, and continue capturing. Means faster and better IR command decoding.
|
||||
- Reduce IRAM usage by 28 bytes.
|
||||
- Improve capture of RC-MM & Panasonic protocols.
|
||||
- Upgrade IRrecvDumpV2 to new IR capture buffer. Much fewer corrupted/truncated IR messages.
|
||||
|
||||
|
||||
## _v1.1.1 (20170413)_
|
||||
|
||||
**[Bug fixes]**
|
||||
- Fix a reported problem when sending the LG protocol. Preemptive fix for possible similar cases.
|
||||
- Fix minor issues in examples.
|
||||
|
||||
**[Features]**
|
||||
- Add documentation to some examples to aid new people.
|
||||
- Add ALPHA support for RC-MM protocol. (Known to be currently not 100% working.)
|
||||
@@ -1,26 +1,72 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRsendGCDemo - demonstrates sending Global Cache-formatted IR codes with IRsend
|
||||
* An IR LED must be connected to ESP8266 pin 0.
|
||||
* IRremoteESP8266: IRsendGCDemo
|
||||
* demonstrates sending Global Cache-formatted IR codes with IRsend
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* http://arcfn.com
|
||||
*
|
||||
* Version 0.2 June, 2017
|
||||
* Added helpful comments
|
||||
* Better includes files.
|
||||
* Version 0.1 30 March, 2016
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* Based on Ken Shirriff's IrsendDemo
|
||||
* Version 0.1 July, 2009
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by IR_LED below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is
|
||||
* flashed. Replace the IR LED with a normal LED if you don't have a digital
|
||||
* camera when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will
|
||||
* interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
|
||||
// Codes are in Global Cache format less the emitter ID and request ID. These codes can be found in GC's Control Tower database.
|
||||
// Codes are in Global Cache format less the emitter ID and request ID.
|
||||
// These codes can be found in GC's Control Tower database.
|
||||
|
||||
unsigned int Samsung_power_toggle[71] = {38000,1,1,170,170,20,63,20,63,20,63,20,20,20,20,20,20,20,20,20,20,20,63,20,63,20,63,20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,63,20,63,20,63,20,63,20,63,20,63,20,1798};
|
||||
uint16_t Samsung_power_toggle[71] = {
|
||||
38000, 1, 1, 170, 170, 20, 63, 20, 63, 20, 63, 20, 20, 20, 20,
|
||||
20, 20, 20, 20, 20, 20, 20, 63, 20, 63, 20, 63, 20, 20, 20,
|
||||
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 63, 20, 20, 20, 20,
|
||||
20, 20, 20, 20, 20, 20, 20, 20, 20, 63, 20, 20, 20, 63, 20,
|
||||
63, 20, 63, 20, 63, 20, 63, 20, 63, 20, 1798};
|
||||
|
||||
IRsend irsend(4); //an IR emitter led is connected to GPIO pin 4
|
||||
#define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
|
||||
void setup()
|
||||
{
|
||||
IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message.
|
||||
|
||||
void setup() {
|
||||
irsend.begin();
|
||||
Serial.begin(115200);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
Serial.println("Toggling power");
|
||||
#if SEND_GLOBALCACHE
|
||||
irsend.sendGC(Samsung_power_toggle, 71);
|
||||
#else // SEND_GLOBALCACHE
|
||||
Serial.println("Can't send because SEND_GLOBALCACHE has been disabled.");
|
||||
#endif // SEND_GLOBALCACHE
|
||||
delay(10000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,85 +1,133 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRGCTCPServer - send Global Cache-formatted codes via TCP.
|
||||
* An IR emitter must be connected to GPIO pin 4.
|
||||
* Version 0.1 1 April, 2016
|
||||
* Hisham Khalifa, http://www.hishamkhalifa.com
|
||||
* Version 0.2 May, 2017
|
||||
* Copyright 2016 Hisham Khalifa, http://www.hishamkhalifa.com
|
||||
* Copyright 2017 David Conran
|
||||
*
|
||||
* Example command - Samsung TV power toggle: 38000,1,1,170,170,20,63,20,63,20,63,20,20,20,20,20,20,20,20,20,20,20,63,20,63,20,63,20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,63,20,63,20,63,20,63,20,63,20,63,20,1798\r\n
|
||||
* For more codes, visit: https://irdb.globalcache.com/
|
||||
*
|
||||
* How to use this program:
|
||||
* 1) Update "kSsid" and "kPassword" below for your WIFI network.
|
||||
* 2) Compile and upload the sketch to your ESP8266 module.
|
||||
* 3) (Optional) Use the serial connection to confirm it started and get the
|
||||
* IP address.
|
||||
* 4) From a client machine, connect to port 4998 on the ESP8266, using
|
||||
* 'telnet', 'nc' (netcat), 'putty' or similar command, etc.
|
||||
* You may need to install one.
|
||||
* Unix/OSX:
|
||||
* Start a shell. Then type:
|
||||
* telnet <esp8266deviceIPaddress> 4998
|
||||
* Windows:
|
||||
* Start a new CMD window, then type:
|
||||
* telnet <esp8266deviceIPaddress> 4998
|
||||
*
|
||||
* 5) Enter a Global Cache-formatted code, starting at the frequency,
|
||||
* and then a return/enter at the end. No spaces. e.g.:
|
||||
*
|
||||
* 38000,1,1,170,170,20,63,20,63,20,63,20,20,20,20,20,20,20,20,20,20,20,63,20,63,20,63,20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,63,20,63,20,63,20,63,20,63,20,63,20,1798
|
||||
*
|
||||
* To exit the 'telnet' command:
|
||||
* press <control> + <]> at the same time, then press 'q', and then <return>.
|
||||
* or:
|
||||
* <control> + <d> might work.
|
||||
*
|
||||
* This program will display the ESP's IP address on the serial console, or you
|
||||
* can check your wifi router for it's address.
|
||||
*/
|
||||
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRremoteInt.h>
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <WiFiServer.h>
|
||||
|
||||
const char* ssid = "...";
|
||||
const char* password = "...";
|
||||
const char* kSsid = "..."; // Put your WIFI SSID here.
|
||||
const char* kPassword = "..."; // Put your WIFI Password here.
|
||||
|
||||
WiFiServer server(4998); // Uses port 4998.
|
||||
WiFiServer server(4998); // Uses port 4998.
|
||||
WiFiClient client;
|
||||
|
||||
unsigned int *codeArray;
|
||||
IRsend irsend(4); //an IR emitter led is connected to GPIO pin 4
|
||||
uint16_t *code_array;
|
||||
#define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
|
||||
void parseString(String str) {
|
||||
int nextIndex;
|
||||
int codeLength = 1;
|
||||
int currentIndex = 0;
|
||||
nextIndex = str.indexOf(',');
|
||||
IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message.
|
||||
|
||||
// change to do/until and remove superfluous repetition below...
|
||||
while (nextIndex != -1) {
|
||||
if (codeLength > 1) {
|
||||
codeArray = (unsigned int*) realloc(codeArray, codeLength * sizeof(unsigned int));
|
||||
} else {
|
||||
codeArray = (unsigned int*) malloc(codeLength * sizeof(unsigned int));
|
||||
}
|
||||
void sendGCString(String str) {
|
||||
int16_t index;
|
||||
uint16_t count;
|
||||
|
||||
codeArray[codeLength-1] = (unsigned int) (str.substring(currentIndex, nextIndex).toInt());
|
||||
|
||||
codeLength++;
|
||||
currentIndex = nextIndex + 1;
|
||||
nextIndex = str.indexOf(',', currentIndex);
|
||||
// Find out how many items there are in the string.
|
||||
index = -1;
|
||||
count = 1;
|
||||
do {
|
||||
index = str.indexOf(',', index + 1);
|
||||
count++;
|
||||
} while (index != -1);
|
||||
|
||||
// Now we know how many there are, allocate the memory to store them all.
|
||||
code_array = reinterpret_cast<uint16_t*>(malloc(count * sizeof(uint16_t)));
|
||||
// Check we malloc'ed successfully.
|
||||
if (code_array == NULL) { // malloc failed, so give up.
|
||||
Serial.printf("\nCan't allocate %d bytes. (%d bytes free)\n",
|
||||
count * sizeof(uint16_t), ESP.getFreeHeap());
|
||||
Serial.println("Giving up & forcing a reboot.");
|
||||
ESP.restart(); // Reboot.
|
||||
delay(500); // Wait for the restart to happen.
|
||||
return; // Should never get here, but just in case.
|
||||
}
|
||||
codeArray = (unsigned int*) realloc(codeArray, codeLength * sizeof(unsigned int));
|
||||
codeArray[codeLength-1] = (unsigned int) (str.substring(currentIndex, nextIndex).toInt());
|
||||
|
||||
irsend.sendGC(codeArray,codeLength);
|
||||
|
||||
// Now convert the strings to integers and place them in code_array.
|
||||
count = 0;
|
||||
uint16_t start_from = 0;
|
||||
do {
|
||||
index = str.indexOf(',', start_from);
|
||||
code_array[count] = str.substring(start_from, index).toInt();
|
||||
start_from = index + 1;
|
||||
count++;
|
||||
} while (index != -1);
|
||||
|
||||
#if SEND_GLOBALCACHE
|
||||
irsend.sendGC(code_array, count); // All done. Send it.
|
||||
#endif // SEND_GLOBALCACHE
|
||||
free(code_array); // Free up the memory allocated.
|
||||
}
|
||||
|
||||
void setup() {
|
||||
// initialize serial:
|
||||
Serial.begin(115200);
|
||||
delay(100);
|
||||
Serial.println(" ");
|
||||
Serial.println("IR TCP Server");
|
||||
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
WiFi.begin(kSsid, kPassword);
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(900);
|
||||
Serial.print(".");
|
||||
}
|
||||
|
||||
server.begin();
|
||||
IPAddress myAddress = WiFi.localIP();
|
||||
Serial.println(myAddress);
|
||||
irsend.begin();
|
||||
server.begin();
|
||||
IPAddress myAddress = WiFi.localIP();
|
||||
Serial.println(myAddress.toString());
|
||||
irsend.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
while(!client) {
|
||||
while (!client)
|
||||
client = server.available();
|
||||
}
|
||||
|
||||
while(!client.connected()){
|
||||
while (!client.connected()) {
|
||||
delay(900);
|
||||
client = server.available();
|
||||
}
|
||||
|
||||
if(client.available()){
|
||||
String irCode = client.readStringUntil('\r'); // Exclusive of \r
|
||||
client.readStringUntil('\n'); // Skip new line as well
|
||||
|
||||
if (client.available()) {
|
||||
String ir_code_str = client.readStringUntil('\r'); // Exclusive of \r
|
||||
client.readStringUntil('\n'); // Skip new line as well
|
||||
client.flush();
|
||||
parseString(irCode);
|
||||
}
|
||||
}
|
||||
sendGCString(ir_code_str);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags = -DMQTT_MAX_PACKET_SIZE=512
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
PubSubClient
|
||||
WifiManager@0.14
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
|
||||
[env:d1_mini]
|
||||
platform=espressif8266
|
||||
framework=arduino
|
||||
board=d1_mini
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,39 +1,78 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRServer - demonstrates sending IR codes controlled from a webserver
|
||||
* An IR LED must be connected to ESP8266 pin 0.
|
||||
* Version 0.1 June, 2015
|
||||
* Version 0.2 June, 2017
|
||||
* Copyright 2015 Mark Szabo
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <IRremoteESP8266.h>
|
||||
|
||||
const char* ssid = ".....";
|
||||
const char* password = ".....";
|
||||
#include <IRsend.h>
|
||||
#include <WiFiClient.h>
|
||||
|
||||
const char* kSsid = ".....";
|
||||
const char* kPassword = ".....";
|
||||
MDNSResponder mdns;
|
||||
|
||||
ESP8266WebServer server(80);
|
||||
|
||||
IRsend irsend(0);
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
|
||||
IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
|
||||
|
||||
void handleRoot() {
|
||||
server.send(200, "text/html", "<html><head> <title>ESP8266 Demo</title></head><body><h1>Hello from ESP8266, you can send NEC encoded IR signals from here!</h1><p><a href=\"ir?code=16769055\">Send 0xFFE01F</a></p><p><a href=\"ir?code=16429347\">Send 0xFAB123</a></p><p><a href=\"ir?code=16771222\">Send 0xFFE896</a></p></body></html>");
|
||||
server.send(200, "text/html",
|
||||
"<html>" \
|
||||
"<head><title>ESP8266 Demo</title></head>" \
|
||||
"<body>" \
|
||||
"<h1>Hello from ESP8266, you can send NEC encoded IR" \
|
||||
"signals from here!</h1>" \
|
||||
"<p><a href=\"ir?code=16769055\">Send 0xFFE01F</a></p>" \
|
||||
"<p><a href=\"ir?code=16429347\">Send 0xFAB123</a></p>" \
|
||||
"<p><a href=\"ir?code=16771222\">Send 0xFFE896</a></p>" \
|
||||
"</body>" \
|
||||
"</html>");
|
||||
}
|
||||
|
||||
void handleIr(){
|
||||
for (uint8_t i=0; i<server.args(); i++){
|
||||
if(server.argName(i) == "code")
|
||||
{
|
||||
unsigned long code = strtoul(server.arg(i).c_str(), NULL, 10);
|
||||
void handleIr() {
|
||||
for (uint8_t i = 0; i < server.args(); i++) {
|
||||
if (server.argName(i) == "code") {
|
||||
uint32_t code = strtoul(server.arg(i).c_str(), NULL, 10);
|
||||
#if SEND_NEC
|
||||
irsend.sendNEC(code, 32);
|
||||
#endif // SEND_NEC
|
||||
}
|
||||
}
|
||||
handleRoot();
|
||||
}
|
||||
|
||||
void handleNotFound(){
|
||||
void handleNotFound() {
|
||||
String message = "File Not Found\n\n";
|
||||
message += "URI: ";
|
||||
message += server.uri();
|
||||
@@ -42,17 +81,16 @@ void handleNotFound(){
|
||||
message += "\nArguments: ";
|
||||
message += server.args();
|
||||
message += "\n";
|
||||
for (uint8_t i=0; i<server.args(); i++){
|
||||
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
|
||||
}
|
||||
for (uint8_t i = 0; i < server.args(); i++)
|
||||
message += ' ' + server.argName(i) + ": " + server.arg(i) + "\n";
|
||||
server.send(404, "text/plain", message);
|
||||
}
|
||||
|
||||
void setup(void){
|
||||
|
||||
void setup(void) {
|
||||
irsend.begin();
|
||||
|
||||
|
||||
Serial.begin(115200);
|
||||
WiFi.begin(ssid, password);
|
||||
WiFi.begin(kSsid, kPassword);
|
||||
Serial.println("");
|
||||
|
||||
// Wait for connection
|
||||
@@ -62,27 +100,27 @@ void setup(void){
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.print("Connected to ");
|
||||
Serial.println(ssid);
|
||||
Serial.println(kSsid);
|
||||
Serial.print("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
Serial.println(WiFi.localIP().toString());
|
||||
|
||||
if (mdns.begin("esp8266", WiFi.localIP())) {
|
||||
Serial.println("MDNS responder started");
|
||||
}
|
||||
|
||||
|
||||
server.on("/", handleRoot);
|
||||
server.on("/ir", handleIr);
|
||||
|
||||
server.on("/ir", handleIr);
|
||||
|
||||
server.on("/inline", [](){
|
||||
server.send(200, "text/plain", "this works as well");
|
||||
});
|
||||
|
||||
server.onNotFound(handleNotFound);
|
||||
|
||||
|
||||
server.begin();
|
||||
Serial.println("HTTP server started");
|
||||
}
|
||||
|
||||
void loop(void){
|
||||
|
||||
void loop(void) {
|
||||
server.handleClient();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,28 +1,52 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRrecvDemo - demonstrates receiving IR codes with IRrecv
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* Version 0.1 Sept, 2015
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* This is very simple teaching code to show you how to use the library.
|
||||
* If you are trying to decode your Infra-Red remote(s) for later replay,
|
||||
* use the IRrecvDumpV2.ino example code instead of this.
|
||||
* An IR detector/demodulator must be connected to the input kRecvPin.
|
||||
* Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* Example circuit diagram:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-receiving
|
||||
* Changes:
|
||||
* Version 0.2 June, 2017
|
||||
* Changed GPIO pin to the same as other examples.
|
||||
* Used our own method for printing a uint64_t.
|
||||
* Changed the baud rate to 115200.
|
||||
* Version 0.1 Sept, 2015
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRrecv.h>
|
||||
#include <IRutils.h>
|
||||
|
||||
int RECV_PIN = 2; //an IR detector/demodulatord is connected to GPIO pin 2
|
||||
// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
|
||||
// board).
|
||||
const uint16_t kRecvPin = 14;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
IRrecv irrecv(kRecvPin);
|
||||
|
||||
decode_results results;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
while (!Serial) // Wait for the serial connection to be establised.
|
||||
delay(50);
|
||||
Serial.println();
|
||||
Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
|
||||
Serial.println(kRecvPin);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (irrecv.decode(&results)) {
|
||||
Serial.println(results.value, HEX);
|
||||
irrecv.resume(); // Receive the next value
|
||||
// print() & println() can't handle printing long longs. (uint64_t)
|
||||
serialPrintUint64(results.value, HEX);
|
||||
Serial.println("");
|
||||
irrecv.resume(); // Receive the next value
|
||||
}
|
||||
delay(100);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,89 +1,104 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRrecvDump - dump details of IR codes with IRrecv
|
||||
* Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
*
|
||||
***** DEPRECATED - DO NOT USE *****
|
||||
* Unless you know what you are doing, you should be using the
|
||||
* IRrecvDumpV2.ino sketch/example instead for capturing & decoding IR messages.
|
||||
* In almost ALL ways it is BETTER, FASTER, and MORE DETAILED.
|
||||
*
|
||||
* This code is left only for legacy reasons, and as another simple example of
|
||||
* how to use the IRremoteESP8266 library.
|
||||
*
|
||||
* As of November 2017 it will no longer be updated or supported.
|
||||
* You have been warned.
|
||||
***** DEPRECATED - DO NOT USE *****
|
||||
*
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* Version 0.1 Sept, 2015
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
|
||||
* Version 0.2 Oct 2017
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009,
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus
|
||||
* (Thanks to zenwheel and other people at the original blog post)
|
||||
* LG added by Darryl Smith (based on the JVC protocol)
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRrecv.h>
|
||||
#include <IRutils.h>
|
||||
|
||||
int RECV_PIN = 2; //an IR detector/demodulatord is connected to GPIO pin 2
|
||||
// an IR detector/demodulator is connected to GPIO pin 2
|
||||
uint16_t RECV_PIN = 2;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
|
||||
decode_results results;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
}
|
||||
|
||||
|
||||
void dump(decode_results *results) {
|
||||
// Dumps out the decode_results structure.
|
||||
// Call this after IRrecv::decode()
|
||||
int count = results->rawlen;
|
||||
uint16_t count = results->rawlen;
|
||||
if (results->decode_type == UNKNOWN) {
|
||||
Serial.print("Unknown encoding: ");
|
||||
}
|
||||
else if (results->decode_type == NEC) {
|
||||
} else if (results->decode_type == NEC) {
|
||||
Serial.print("Decoded NEC: ");
|
||||
|
||||
}
|
||||
else if (results->decode_type == SONY) {
|
||||
} else if (results->decode_type == SONY) {
|
||||
Serial.print("Decoded SONY: ");
|
||||
}
|
||||
else if (results->decode_type == RC5) {
|
||||
} else if (results->decode_type == RC5) {
|
||||
Serial.print("Decoded RC5: ");
|
||||
}
|
||||
else if (results->decode_type == RC6) {
|
||||
} else if (results->decode_type == RC5X) {
|
||||
Serial.print("Decoded RC5X: ");
|
||||
} else if (results->decode_type == RC6) {
|
||||
Serial.print("Decoded RC6: ");
|
||||
}
|
||||
else if (results->decode_type == PANASONIC) {
|
||||
} else if (results->decode_type == RCMM) {
|
||||
Serial.print("Decoded RCMM: ");
|
||||
} else if (results->decode_type == PANASONIC) {
|
||||
Serial.print("Decoded PANASONIC - Address: ");
|
||||
Serial.print(results->panasonicAddress, HEX);
|
||||
Serial.print(results->address, HEX);
|
||||
Serial.print(" Value: ");
|
||||
}
|
||||
else if (results->decode_type == LG) {
|
||||
} else if (results->decode_type == LG) {
|
||||
Serial.print("Decoded LG: ");
|
||||
}
|
||||
else if (results->decode_type == JVC) {
|
||||
} else if (results->decode_type == JVC) {
|
||||
Serial.print("Decoded JVC: ");
|
||||
}
|
||||
else if (results->decode_type == AIWA_RC_T501) {
|
||||
} else if (results->decode_type == AIWA_RC_T501) {
|
||||
Serial.print("Decoded AIWA RC T501: ");
|
||||
}
|
||||
else if (results->decode_type == WHYNTER) {
|
||||
} else if (results->decode_type == WHYNTER) {
|
||||
Serial.print("Decoded Whynter: ");
|
||||
} else if (results->decode_type == NIKAI) {
|
||||
Serial.print("Decoded Nikai: ");
|
||||
}
|
||||
Serial.print(results->value, HEX);
|
||||
serialPrintUint64(results->value, 16);
|
||||
Serial.print(" (");
|
||||
Serial.print(results->bits, DEC);
|
||||
Serial.println(" bits)");
|
||||
Serial.print("Raw (");
|
||||
Serial.print(count, DEC);
|
||||
Serial.print("): ");
|
||||
Serial.print("): {");
|
||||
|
||||
for (int i = 1; i < count; i++) {
|
||||
for (uint16_t i = 1; i < count; i++) {
|
||||
if (i % 100 == 0)
|
||||
yield(); // Preemptive yield every 100th entry to feed the WDT.
|
||||
if (i & 1) {
|
||||
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
||||
Serial.print(results->rawbuf[i] * kRawTick, DEC);
|
||||
} else {
|
||||
Serial.print(", ");
|
||||
Serial.print((uint32_t) results->rawbuf[i] * kRawTick, DEC);
|
||||
}
|
||||
else {
|
||||
Serial.write('-');
|
||||
Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
|
||||
}
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println();
|
||||
Serial.println("};");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (irrecv.decode(&results)) {
|
||||
Serial.println(results.value, HEX);
|
||||
dump(&results);
|
||||
irrecv.resume(); // Receive the next value
|
||||
Serial.println("DEPRECATED: Please use IRrecvDumpV2.ino instead!");
|
||||
irrecv.resume(); // Receive the next value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,173 +1,254 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRrecvDumpV2 - dump details of IR codes with IRrecv
|
||||
* An IR detector/demodulator must be connected to the input RECV_PIN.
|
||||
* An IR detector/demodulator must be connected to the input kRecvPin.
|
||||
*
|
||||
* Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* Copyright 2017 David Conran
|
||||
*
|
||||
* Example circuit diagram:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-receiving
|
||||
*
|
||||
* Changes:
|
||||
* Version 0.4 July, 2018
|
||||
* - Minor improvements and more A/C unit support.
|
||||
* Version 0.3 November, 2017
|
||||
* - Support for A/C decoding for some protcols.
|
||||
* Version 0.2 April, 2017
|
||||
* - Decode from a copy of the data so we can start capturing faster thus
|
||||
* reduce the likelihood of miscaptures.
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009,
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRrecv.h>
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRutils.h>
|
||||
// The following are only needed for extended decoding of A/C Messages
|
||||
#include <ir_Coolix.h>
|
||||
#include <ir_Daikin.h>
|
||||
#include <ir_Fujitsu.h>
|
||||
#include <ir_Gree.h>
|
||||
#include <ir_Haier.h>
|
||||
#include <ir_Kelvinator.h>
|
||||
#include <ir_Midea.h>
|
||||
#include <ir_Mitsubishi.h>
|
||||
#include <ir_Panasonic.h>
|
||||
#include <ir_Samsung.h>
|
||||
#include <ir_Toshiba.h>
|
||||
|
||||
// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU board).
|
||||
int RECV_PIN = 14;
|
||||
// ==================== start of TUNEABLE PARAMETERS ====================
|
||||
// An IR detector/demodulator is connected to GPIO pin 14
|
||||
// e.g. D5 on a NodeMCU board.
|
||||
const uint16_t kRecvPin = 14;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
// The Serial connection baud rate.
|
||||
// i.e. Status message will be sent to the PC at this baud rate.
|
||||
// Try to avoid slow speeds like 9600, as you will miss messages and
|
||||
// cause other problems. 115200 (or faster) is recommended.
|
||||
// NOTE: Make sure you set your Serial Monitor to the same speed.
|
||||
const uint32_t kBaudRate = 115200;
|
||||
|
||||
decode_results results; // Somewhere to store the results
|
||||
irparams_t save; // A place to copy the interrupt state while decoding.
|
||||
// As this program is a special purpose capture/decoder, let us use a larger
|
||||
// than normal buffer so we can handle Air Conditioner remote codes.
|
||||
const uint16_t kCaptureBufferSize = 1024;
|
||||
|
||||
// kTimeout is the Nr. of milli-Seconds of no-more-data before we consider a
|
||||
// message ended.
|
||||
// This parameter is an interesting trade-off. The longer the timeout, the more
|
||||
// complex a message it can capture. e.g. Some device protocols will send
|
||||
// multiple message packets in quick succession, like Air Conditioner remotes.
|
||||
// Air Coniditioner protocols often have a considerable gap (20-40+ms) between
|
||||
// packets.
|
||||
// The downside of a large timeout value is a lot of less complex protocols
|
||||
// send multiple messages when the remote's button is held down. The gap between
|
||||
// them is often also around 20+ms. This can result in the raw data be 2-3+
|
||||
// times larger than needed as it has captured 2-3+ messages in a single
|
||||
// capture. Setting a low timeout value can resolve this.
|
||||
// So, choosing the best kTimeout value for your use particular case is
|
||||
// quite nuanced. Good luck and happy hunting.
|
||||
// NOTE: Don't exceed kMaxTimeoutMs. Typically 130ms.
|
||||
#if DECODE_AC
|
||||
// Some A/C units have gaps in their protocols of ~40ms. e.g. Kelvinator
|
||||
// A value this large may swallow repeats of some protocols
|
||||
const uint8_t kTimeout = 50;
|
||||
#else // DECODE_AC
|
||||
// Suits most messages, while not swallowing many repeats.
|
||||
const uint8_t kTimeout = 15;
|
||||
#endif // DECODE_AC
|
||||
// Alternatives:
|
||||
// const uint8_t kTimeout = 90;
|
||||
// Suits messages with big gaps like XMP-1 & some aircon units, but can
|
||||
// accidentally swallow repeated messages in the rawData[] output.
|
||||
//
|
||||
// const uint8_t kTimeout = kMaxTimeoutMs;
|
||||
// This will set it to our currently allowed maximum.
|
||||
// Values this high are problematic because it is roughly the typical boundary
|
||||
// where most messages repeat.
|
||||
// e.g. It will stop decoding a message and start sending it to serial at
|
||||
// precisely the time when the next message is likely to be transmitted,
|
||||
// and may miss it.
|
||||
|
||||
// Set the smallest sized "UNKNOWN" message packets we actually care about.
|
||||
// This value helps reduce the false-positive detection rate of IR background
|
||||
// noise as real messages. The chances of background IR noise getting detected
|
||||
// as a message increases with the length of the kTimeout value. (See above)
|
||||
// The downside of setting this message too large is you can miss some valid
|
||||
// short messages for protocols that this library doesn't yet decode.
|
||||
//
|
||||
// Set higher if you get lots of random short UNKNOWN messages when nothing
|
||||
// should be sending a message.
|
||||
// Set lower if you are sure your setup is working, but it doesn't see messages
|
||||
// from your device. (e.g. Other IR remotes work.)
|
||||
// NOTE: Set this value very high to effectively turn off UNKNOWN detection.
|
||||
const uint16_t kMinUnknownSize = 12;
|
||||
// ==================== end of TUNEABLE PARAMETERS ====================
|
||||
|
||||
// Use turn on the save buffer feature for more complete capture coverage.
|
||||
IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
|
||||
|
||||
decode_results results; // Somewhere to store the results
|
||||
|
||||
// Display the human readable state of an A/C message if we can.
|
||||
void dumpACInfo(decode_results *results) {
|
||||
String description = "";
|
||||
#if DECODE_DAIKIN
|
||||
if (results->decode_type == DAIKIN) {
|
||||
IRDaikinESP ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_DAIKIN
|
||||
#if DECODE_FUJITSU_AC
|
||||
if (results->decode_type == FUJITSU_AC) {
|
||||
IRFujitsuAC ac(0);
|
||||
ac.setRaw(results->state, results->bits / 8);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_FUJITSU_AC
|
||||
#if DECODE_KELVINATOR
|
||||
if (results->decode_type == KELVINATOR) {
|
||||
IRKelvinatorAC ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_KELVINATOR
|
||||
#if DECODE_MITSUBISHI_AC
|
||||
if (results->decode_type == MITSUBISHI_AC) {
|
||||
IRMitsubishiAC ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_MITSUBISHI_AC
|
||||
#if DECODE_TOSHIBA_AC
|
||||
if (results->decode_type == TOSHIBA_AC) {
|
||||
IRToshibaAC ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_TOSHIBA_AC
|
||||
#if DECODE_GREE
|
||||
if (results->decode_type == GREE) {
|
||||
IRGreeAC ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_GREE
|
||||
#if DECODE_MIDEA
|
||||
if (results->decode_type == MIDEA) {
|
||||
IRMideaAC ac(0);
|
||||
ac.setRaw(results->value); // Midea uses value instead of state.
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_MIDEA
|
||||
#if DECODE_HAIER_AC
|
||||
if (results->decode_type == HAIER_AC) {
|
||||
IRHaierAC ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_HAIER_AC
|
||||
#if DECODE_HAIER_AC_YRW02
|
||||
if (results->decode_type == HAIER_AC_YRW02) {
|
||||
IRHaierACYRW02 ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_HAIER_AC_YRW02
|
||||
#if DECODE_SAMSUNG_AC
|
||||
if (results->decode_type == SAMSUNG_AC) {
|
||||
IRSamsungAc ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_SAMSUNG_AC
|
||||
#if DECODE_COOLIX
|
||||
if (results->decode_type == COOLIX) {
|
||||
IRCoolixAC ac(0);
|
||||
ac.setRaw(results->value); // Coolix uses value instead of state.
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_COOLIX
|
||||
#if DECODE_PANASONIC_AC
|
||||
if (results->decode_type == PANASONIC_AC &&
|
||||
results->bits > kPanasonicAcShortBits) {
|
||||
IRPanasonicAc ac(0);
|
||||
ac.setRaw(results->state);
|
||||
description = ac.toString();
|
||||
}
|
||||
#endif // DECODE_PANASONIC_AC
|
||||
// If we got a human-readable description of the message, display it.
|
||||
if (description != "") Serial.println("Mesg Desc.: " + description);
|
||||
}
|
||||
|
||||
// The section of code run only once at start-up.
|
||||
void setup() {
|
||||
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY); // Status message will be sent to the PC at 115200 baud
|
||||
Serial.begin(kBaudRate, SERIAL_8N1, SERIAL_TX_ONLY);
|
||||
while (!Serial) // Wait for the serial connection to be establised.
|
||||
delay(50);
|
||||
Serial.println();
|
||||
Serial.print("IRrecvDumpV2 is now running and waiting for IR input on Pin ");
|
||||
Serial.println(kRecvPin);
|
||||
|
||||
#if DECODE_HASH
|
||||
// Ignore messages with less than minimum on or off pulses.
|
||||
irrecv.setUnknownThreshold(kMinUnknownSize);
|
||||
#endif // DECODE_HASH
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Display IR code
|
||||
//
|
||||
void ircode(decode_results *results) {
|
||||
// Panasonic has an Address
|
||||
if (results->decode_type == PANASONIC) {
|
||||
Serial.print(results->panasonicAddress, HEX);
|
||||
Serial.print(":");
|
||||
}
|
||||
// Print Code
|
||||
Serial.print(results->value, HEX);
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Display encoding type
|
||||
//
|
||||
void encoding(decode_results *results) {
|
||||
switch (results->decode_type) {
|
||||
default:
|
||||
case UNKNOWN: Serial.print("UNKNOWN"); break ;
|
||||
case NEC: Serial.print("NEC"); break ;
|
||||
case SONY: Serial.print("SONY"); break ;
|
||||
case RC5: Serial.print("RC5"); break ;
|
||||
case RC6: Serial.print("RC6"); break ;
|
||||
case DISH: Serial.print("DISH"); break ;
|
||||
case SHARP: Serial.print("SHARP"); break ;
|
||||
case JVC: Serial.print("JVC"); break ;
|
||||
case SANYO: Serial.print("SANYO"); break ;
|
||||
case MITSUBISHI: Serial.print("MITSUBISHI"); break ;
|
||||
case SAMSUNG: Serial.print("SAMSUNG"); break ;
|
||||
case LG: Serial.print("LG"); break ;
|
||||
case WHYNTER: Serial.print("WHYNTER"); break ;
|
||||
case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ;
|
||||
case PANASONIC: Serial.print("PANASONIC"); break ;
|
||||
case DENON: Serial.print("DENON"); break ;
|
||||
}
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Dump out the decode_results structure.
|
||||
//
|
||||
void dumpInfo (decode_results *results) {
|
||||
if (results->overflow) {
|
||||
Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWBUF");
|
||||
return;
|
||||
}
|
||||
|
||||
// Show Encoding standard
|
||||
Serial.print("Encoding : ");
|
||||
encoding(results);
|
||||
Serial.println("");
|
||||
|
||||
// Show Code & length
|
||||
Serial.print("Code : ");
|
||||
ircode(results);
|
||||
Serial.print(" (");
|
||||
Serial.print(results->bits, DEC);
|
||||
Serial.println(" bits)");
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Dump out the decode_results structure.
|
||||
//
|
||||
void dumpRaw(decode_results *results) {
|
||||
// Print Raw data
|
||||
Serial.print("Timing[");
|
||||
Serial.print(results->rawlen-1, DEC);
|
||||
Serial.println("]: ");
|
||||
|
||||
for (int i = 1; i < results->rawlen; i++) {
|
||||
unsigned long x = results->rawbuf[i] * USECPERTICK;
|
||||
if (!(i & 1)) { // even
|
||||
Serial.print("-");
|
||||
if (x < 1000) Serial.print(" ") ;
|
||||
if (x < 100) Serial.print(" ") ;
|
||||
Serial.print(x, DEC);
|
||||
} else { // odd
|
||||
Serial.print(" ");
|
||||
Serial.print("+");
|
||||
if (x < 1000) Serial.print(" ") ;
|
||||
if (x < 100) Serial.print(" ") ;
|
||||
Serial.print(x, DEC);
|
||||
if (i < results->rawlen-1) Serial.print(", "); //',' not needed for last one
|
||||
}
|
||||
if (!(i % 8)) Serial.println("");
|
||||
}
|
||||
Serial.println(""); // Newline
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Dump out the decode_results structure.
|
||||
//
|
||||
void dumpCode (decode_results *results) {
|
||||
// Start declaration
|
||||
Serial.print("unsigned int "); // variable type
|
||||
Serial.print("rawData["); // array name
|
||||
Serial.print(results->rawlen - 1, DEC); // array size
|
||||
Serial.print("] = {"); // Start declaration
|
||||
|
||||
// Dump data
|
||||
for (int i = 1; i < results->rawlen; i++) {
|
||||
Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
|
||||
if ( i < results->rawlen-1 ) Serial.print(","); // ',' not needed on last one
|
||||
if (!(i & 1)) Serial.print(" ");
|
||||
}
|
||||
|
||||
// End declaration
|
||||
Serial.print("};"); //
|
||||
|
||||
// Comment
|
||||
Serial.print(" // ");
|
||||
encoding(results);
|
||||
Serial.print(" ");
|
||||
ircode(results);
|
||||
|
||||
// Newline
|
||||
Serial.println("");
|
||||
|
||||
// Now dump "known" codes
|
||||
if (results->decode_type != UNKNOWN) {
|
||||
// Some protocols have an address
|
||||
if (results->decode_type == PANASONIC) {
|
||||
Serial.print("unsigned int addr = 0x");
|
||||
Serial.print(results->panasonicAddress, HEX);
|
||||
Serial.println(";");
|
||||
}
|
||||
|
||||
// All protocols have data
|
||||
Serial.print("unsigned int data = 0x");
|
||||
Serial.print(results->value, HEX);
|
||||
Serial.println(";");
|
||||
}
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// The repeating section of the code
|
||||
//
|
||||
void loop() {
|
||||
// Check if the IR code has been received.
|
||||
if (irrecv.decode(&results, &save)) {
|
||||
dumpInfo(&results); // Output the results
|
||||
dumpRaw(&results); // Output the results in RAW format
|
||||
dumpCode(&results); // Output the results as source code
|
||||
Serial.println(""); // Blank line between entries
|
||||
if (irrecv.decode(&results)) {
|
||||
// Display a crude timestamp.
|
||||
uint32_t now = millis();
|
||||
Serial.printf("Timestamp : %06u.%03u\n", now / 1000, now % 1000);
|
||||
if (results.overflow)
|
||||
Serial.printf(
|
||||
"WARNING: IR code is too big for buffer (>= %d). "
|
||||
"This result shouldn't be trusted until this is resolved. "
|
||||
"Edit & increase kCaptureBufferSize.\n",
|
||||
kCaptureBufferSize);
|
||||
// Display the basic output of what we found.
|
||||
Serial.print(resultToHumanReadableBasic(&results));
|
||||
dumpACInfo(&results); // Display any extra A/C info if we have it.
|
||||
yield(); // Feed the WDT as the text output can take a while to print.
|
||||
|
||||
// Display the library version the message was captured with.
|
||||
Serial.print("Library : v");
|
||||
Serial.println(_IRREMOTEESP8266_VERSION_);
|
||||
Serial.println();
|
||||
|
||||
// Output RAW timing info of the result.
|
||||
Serial.println(resultToTimingInfo(&results));
|
||||
yield(); // Feed the WDT (again)
|
||||
|
||||
// Output the results as source code
|
||||
Serial.println(resultToSourceCode(&results));
|
||||
Serial.println(""); // Blank line between entries
|
||||
yield(); // Feed the WDT (again)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,10 +1,14 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRsendDemo - demonstrates sending IR codes with IRsend.
|
||||
/* IRremoteESP8266: IRsendDemo - demonstrates sending IR codes with IRsend.
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
|
||||
* Version 1.0 April, 2017
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009,
|
||||
* Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
@@ -22,26 +26,46 @@
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*
|
||||
* Version 1.0 April, 2017
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
|
||||
IRsend irsend(4); //an IR led is connected to GPIO pin 4 (D2)
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
|
||||
void setup()
|
||||
{
|
||||
IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
|
||||
|
||||
// Example of data captured by IRrecvDumpV2.ino
|
||||
uint16_t rawData[67] = {9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550,
|
||||
600, 1650, 650, 550, 600, 1650, 650, 1650, 650, 1650,
|
||||
600, 550, 650, 1650, 650, 1650, 650, 550, 600, 1650,
|
||||
650, 1650, 650, 550, 650, 550, 650, 1650, 650, 550,
|
||||
650, 550, 650, 550, 600, 550, 650, 550, 650, 550,
|
||||
650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
|
||||
650, 1650, 650, 1650, 650, 1650, 600};
|
||||
|
||||
void setup() {
|
||||
irsend.begin();
|
||||
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
#if SEND_NEC
|
||||
Serial.println("NEC");
|
||||
irsend.sendNEC(0x00FFE01FUL, 32);
|
||||
#endif // SEND_NEC
|
||||
delay(2000);
|
||||
#if SEND_SONY
|
||||
Serial.println("Sony");
|
||||
irsend.sendSony(0xa90, 12, 2);
|
||||
#endif // SEND_SONY
|
||||
delay(2000);
|
||||
#if SEND_RAW
|
||||
Serial.println("a rawData capture from IRrecvDumpV2");
|
||||
irsend.sendRaw(rawData, 67, 38); // Send a raw data capture at 38kHz.
|
||||
#endif // SEND_RAW
|
||||
delay(2000);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,112 @@
|
||||
/* IRremoteESP8266: IRsendProntoDemo
|
||||
* Copyright 2017 David Conran
|
||||
*
|
||||
* Demonstrates sending Pronto codes with IRsend.
|
||||
*
|
||||
* Version 1.0 June, 2017
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2), unless you
|
||||
* change the kIrLed value below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
|
||||
IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
|
||||
|
||||
// Panasonic Plasma TV Descrete code (Power On).
|
||||
// Acquired from:
|
||||
// https://irdb.globalcache.com/
|
||||
// e.g.
|
||||
// 0000 006D 0000 0022 00ac 00ac 0016 0040 0016 0040 0016 0040 0016 0015 0016
|
||||
// 0015 0016 0015 0016 0015 0016 0015 0016 0040 0016 0040 0016 0040 0016 0015
|
||||
// 0016 0015 0016 0015 0016 0015 0016 0015 0016 0040 0016 0015 0016 0015 0016
|
||||
// 0040 0016 0040 0016 0015 0016 0015 0016 0040 0016 0015 0016 0040 0016 0040
|
||||
// 0016 0015 0016 0015 0016 0040 0016 0040 0016 0015 0016 071c
|
||||
//
|
||||
// Or the equiv. of sendSamsung(0xE0E09966);
|
||||
uint16_t samsungProntoCode[72] = {
|
||||
0x0000, 0x006D, 0x0000, 0x0022,
|
||||
0x00ac, 0x00ac, 0x0016, 0x0040, 0x0016, 0x0040, 0x0016, 0x0040,
|
||||
0x0016, 0x0015, 0x0016, 0x0015, 0x0016, 0x0015, 0x0016, 0x0015,
|
||||
0x0016, 0x0015, 0x0016, 0x0040, 0x0016, 0x0040, 0x0016, 0x0040,
|
||||
0x0016, 0x0015, 0x0016, 0x0015, 0x0016, 0x0015, 0x0016, 0x0015,
|
||||
0x0016, 0x0015, 0x0016, 0x0040, 0x0016, 0x0015, 0x0016, 0x0015,
|
||||
0x0016, 0x0040, 0x0016, 0x0040, 0x0016, 0x0015, 0x0016, 0x0015,
|
||||
0x0016, 0x0040, 0x0016, 0x0015, 0x0016, 0x0040, 0x0016, 0x0040,
|
||||
0x0016, 0x0015, 0x0016, 0x0015, 0x0016, 0x0040, 0x0016, 0x0040,
|
||||
0x0016, 0x0015, 0x0016, 0x071c
|
||||
};
|
||||
|
||||
// Panasonic Plasma TV Descrete code (Power On).
|
||||
// Acquired from:
|
||||
// ftp://ftp.panasonic.com/pub/panasonic/drivers/monitors/Discrete-remote-control-codesProntoCCFformat.pdf
|
||||
// e.g.
|
||||
// 0000 0071 0000 0032 0080 003F 0010 0010 0010 0030 0010 0010 0010 0010 0010
|
||||
// 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010
|
||||
// 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010
|
||||
// 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010
|
||||
// 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010
|
||||
// 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0010 0010 0010 0010 0030
|
||||
// 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0030 0010 0A98
|
||||
//
|
||||
// Or the equiv. of sendPanasonic64(0x400401007C7D);
|
||||
uint16_t panasonicProntoCode[104] = {
|
||||
0x0000, 0x0071, 0x0000, 0x0032,
|
||||
0x0080, 0x003F, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
|
||||
0x0010, 0x0030, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0030,
|
||||
0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0010,
|
||||
0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0030,
|
||||
0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0010,
|
||||
0x0010, 0x0030, 0x0010, 0x0A98};
|
||||
|
||||
void setup() {
|
||||
irsend.begin();
|
||||
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
#if SEND_PRONTO
|
||||
Serial.println("Sending a Samsung TV 'on' command.");
|
||||
irsend.sendPronto(samsungProntoCode, 72);
|
||||
delay(2000);
|
||||
Serial.println("Sending a Panasonic Plasma TV 'on' command.");
|
||||
irsend.sendPronto(panasonicProntoCode, 104);
|
||||
delay(2000);
|
||||
#else // SEND_PRONTO
|
||||
Serial.println("Can't send because SEND_PRONTO has been disabled.");
|
||||
delay(10000);
|
||||
#endif // SEND_PRONTO
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,29 +1,63 @@
|
||||
/*
|
||||
* IRremoteESP8266: IRsendDemo - demonstrates sending IR codes with IRsend
|
||||
* An IR LED must be connected to ESP8266 pin 0.
|
||||
* Version 0.1 June, 2015
|
||||
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
|
||||
#define PanasonicAddress 0x4004 // Panasonic address (Pre data)
|
||||
#define PanasonicPower 0x100BCBD // Panasonic Power button
|
||||
#include <IRsend.h>
|
||||
|
||||
#define JVCPower 0xC5E8
|
||||
const uint16_t kPanasonicAddress = 0x4004; // Panasonic address (Pre data)
|
||||
const uint32_t kPanasonicPower = 0x100BCBD; // Panasonic Power button
|
||||
const uint16_t kJVCPower = 0xC5E8;
|
||||
|
||||
IRsend irsend(0); //an IR led is connected to GPIO pin 0
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
|
||||
void setup()
|
||||
{
|
||||
irsend.begin();
|
||||
IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
|
||||
|
||||
void setup() {
|
||||
irsend.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
irsend.sendPanasonic(PanasonicAddress,PanasonicPower); // This should turn your TV on and off
|
||||
|
||||
irsend.sendJVC(JVCPower, 16,0); // hex value, 16 bits, no repeat
|
||||
delayMicroseconds(50); // see http://www.sbprojects.com/knowledge/ir/jvc.php for information
|
||||
irsend.sendJVC(JVCPower, 16,1); // hex value, 16 bits, repeat
|
||||
delayMicroseconds(50);
|
||||
// This should turn your TV on and off
|
||||
#if SEND_PANASONIC
|
||||
irsend.sendPanasonic(kPanasonicAddress, kPanasonicPower);
|
||||
#else // SEND_PANASONIC
|
||||
Serial.println("Can't send because SEND_PANASONIC has been disabled.");
|
||||
#endif // SEND_PANASONIC
|
||||
|
||||
#if SEND_JVC
|
||||
irsend.sendJVC(kJVCPower, 16, 1); // hex value, 16 bits, single repeat
|
||||
#else // SEND_JVC
|
||||
Serial.println("Can't send because SEND_JVC has been disabled.");
|
||||
#endif // SEND_JVC
|
||||
delay(10000); // Wait 10 seconds before we repeat everything.
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,263 @@
|
||||
// Copyright 2015 chaeplin
|
||||
// Copyright 2017 xpokor22
|
||||
// This is based on:
|
||||
// https://github.com/z3t0/Arduino-IRremote/blob/master/examples/LGACSendDemo/LGACSendDemo.ino
|
||||
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
|
||||
|
||||
IRsend irsend(14); // An IR LED is controlled by GPIO pin 14 (D5)
|
||||
|
||||
// 0 : TOWER
|
||||
// 1 : WALL
|
||||
const unsigned int kAc_Type = 1;
|
||||
|
||||
// 0 : cooling
|
||||
// 1 : heating
|
||||
unsigned int ac_heat = 1;
|
||||
|
||||
// 0 : off
|
||||
// 1 : on
|
||||
unsigned int ac_power_on = 0;
|
||||
|
||||
// 0 : off
|
||||
// 1 : on --> power on
|
||||
unsigned int ac_air_clean_state = 0;
|
||||
|
||||
// temperature : 18 ~ 30
|
||||
unsigned int ac_temperature = 24;
|
||||
|
||||
// 0 : low
|
||||
// 1 : mid
|
||||
// 2 : high
|
||||
// if kAc_Type = 1, 3 : change
|
||||
unsigned int ac_flow = 0;
|
||||
|
||||
const uint8_t kAc_Flow_Tower[3] = {0, 4, 6};
|
||||
const uint8_t kAc_Flow_Wall[4] = {0, 2, 4, 5};
|
||||
|
||||
uint32_t ac_code_to_sent;
|
||||
|
||||
void Ac_Send_Code(uint32_t code) {
|
||||
Serial.print("code to send : ");
|
||||
Serial.print(code, BIN);
|
||||
Serial.print(" : ");
|
||||
Serial.println(code, HEX);
|
||||
|
||||
#if SEND_LG
|
||||
irsend.sendLG(code, 28);
|
||||
#else // SEND_LG
|
||||
Serial.println("Can't send because SEND_LG has been disabled.");
|
||||
#endif // SEND_LG
|
||||
}
|
||||
|
||||
void Ac_Activate(unsigned int temperature, unsigned int air_flow,
|
||||
unsigned int heat) {
|
||||
ac_heat = heat;
|
||||
unsigned int ac_msbits1 = 8;
|
||||
unsigned int ac_msbits2 = 8;
|
||||
unsigned int ac_msbits3 = 0;
|
||||
unsigned int ac_msbits4;
|
||||
if (ac_heat == 1)
|
||||
ac_msbits4 = 4; // heating
|
||||
else
|
||||
ac_msbits4 = 0; // cooling
|
||||
unsigned int ac_msbits5 = (temperature < 15) ? 0 : temperature - 15;
|
||||
unsigned int ac_msbits6 = 0;
|
||||
|
||||
if (air_flow <= 2) {
|
||||
if (kAc_Type == 0)
|
||||
ac_msbits6 = kAc_Flow_Tower[air_flow];
|
||||
else
|
||||
ac_msbits6 = kAc_Flow_Wall[air_flow];
|
||||
}
|
||||
|
||||
// calculating using other values
|
||||
unsigned int ac_msbits7 = (ac_msbits3 + ac_msbits4 + ac_msbits5 +
|
||||
ac_msbits6) & B00001111;
|
||||
ac_code_to_sent = ac_msbits1 << 4;
|
||||
ac_code_to_sent = (ac_code_to_sent + ac_msbits2) << 4;
|
||||
ac_code_to_sent = (ac_code_to_sent + ac_msbits3) << 4;
|
||||
ac_code_to_sent = (ac_code_to_sent + ac_msbits4) << 4;
|
||||
ac_code_to_sent = (ac_code_to_sent + ac_msbits5) << 4;
|
||||
ac_code_to_sent = (ac_code_to_sent + ac_msbits6) << 4;
|
||||
ac_code_to_sent = (ac_code_to_sent + ac_msbits7);
|
||||
|
||||
Ac_Send_Code(ac_code_to_sent);
|
||||
|
||||
ac_power_on = 1;
|
||||
ac_temperature = temperature;
|
||||
ac_flow = air_flow;
|
||||
}
|
||||
|
||||
void Ac_Change_Air_Swing(int air_swing) {
|
||||
if (kAc_Type == 0) {
|
||||
if (air_swing == 1)
|
||||
ac_code_to_sent = 0x881316B;
|
||||
else
|
||||
ac_code_to_sent = 0x881317C;
|
||||
} else {
|
||||
if (air_swing == 1)
|
||||
ac_code_to_sent = 0x8813149;
|
||||
else
|
||||
ac_code_to_sent = 0x881315A;
|
||||
}
|
||||
Ac_Send_Code(ac_code_to_sent);
|
||||
}
|
||||
|
||||
void Ac_Power_Down() {
|
||||
ac_code_to_sent = 0x88C0051;
|
||||
|
||||
Ac_Send_Code(ac_code_to_sent);
|
||||
|
||||
ac_power_on = 0;
|
||||
}
|
||||
|
||||
void Ac_Air_Clean(int air_clean) {
|
||||
if (air_clean == '1')
|
||||
ac_code_to_sent = 0x88C000C;
|
||||
else
|
||||
ac_code_to_sent = 0x88C0084;
|
||||
|
||||
Ac_Send_Code(ac_code_to_sent);
|
||||
|
||||
ac_air_clean_state = air_clean;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
delay(1000);
|
||||
irsend.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
char b = ' ';
|
||||
Serial.println("# a : mode or temp b : air_flow, temp, swing, clean,"
|
||||
" cooling/heating");
|
||||
Serial.println("# 0 : off 0");
|
||||
Serial.println("# 1 : on 0");
|
||||
Serial.println("# 2 : air_swing 0 or 1");
|
||||
Serial.println("# 3 : air_clean 0 or 1");
|
||||
Serial.println("# 4 : air_flow 0 ~ 2 : flow");
|
||||
Serial.println("# + : temp + 1");
|
||||
Serial.println("# - : temp - 1");
|
||||
Serial.println("# c : cooling");
|
||||
Serial.println("# h : heating");
|
||||
Serial.println("# m : change cooling to air clean, air clean to cooling");
|
||||
|
||||
Serial.println("a="); // Prompt User for input
|
||||
while (Serial.available() == 0) { // Wait for user input
|
||||
}
|
||||
char a = Serial.read(); // Read user input into a
|
||||
switch (a) {
|
||||
case '0':
|
||||
case '1':
|
||||
case '+':
|
||||
case '-':
|
||||
case 'c':
|
||||
case 'h':
|
||||
case 'm':
|
||||
break;
|
||||
default:
|
||||
Serial.println("b="); // Prompt User for input
|
||||
while (Serial.available() == 0) {}
|
||||
b = Serial.read();
|
||||
}
|
||||
|
||||
/*
|
||||
# a : mode or temp b : air_flow, temp, swing, clean, cooling/heating
|
||||
# 18 ~ 30 : temp 0 ~ 2 : flow // on
|
||||
# 0 : off 0
|
||||
# 1 : on 0
|
||||
# 2 : air_swing 0 or 1
|
||||
# 3 : air_clean 0 or 1
|
||||
# 4 : air_flow 0 ~ 3 : flow
|
||||
# + : temp + 1
|
||||
# - : temp - 1
|
||||
# c : cooling
|
||||
# h : heating
|
||||
# m : change cooling to air clean, air clean to cooling
|
||||
*/
|
||||
Serial.print("a : ");
|
||||
Serial.print(a);
|
||||
Serial.print(" b : ");
|
||||
Serial.println(b);
|
||||
|
||||
switch (a) {
|
||||
case '0': // off
|
||||
Ac_Power_Down();
|
||||
break;
|
||||
case '1': // on
|
||||
Ac_Activate(ac_temperature, ac_flow, ac_heat);
|
||||
break;
|
||||
case '2':
|
||||
if (b == '0')
|
||||
Ac_Change_Air_Swing(0);
|
||||
else
|
||||
Ac_Change_Air_Swing(1);
|
||||
break;
|
||||
case '3': // 1 : clean on, power on
|
||||
if (b == '0' || b == '1')
|
||||
Ac_Air_Clean(b);
|
||||
break;
|
||||
case '4':
|
||||
switch (b) {
|
||||
case '1':
|
||||
Ac_Activate(ac_temperature, 1, ac_heat);
|
||||
break;
|
||||
case '2':
|
||||
Ac_Activate(ac_temperature, 2, ac_heat);
|
||||
break;
|
||||
case '3':
|
||||
Ac_Activate(ac_temperature, 3, ac_heat);
|
||||
break;
|
||||
default:
|
||||
Ac_Activate(ac_temperature, 0, ac_heat);
|
||||
}
|
||||
break;
|
||||
case '+':
|
||||
if (18 <= ac_temperature && ac_temperature <= 29)
|
||||
Ac_Activate((ac_temperature + 1), ac_flow, ac_heat);
|
||||
break;
|
||||
case '-':
|
||||
if (19 <= ac_temperature && ac_temperature <= 30)
|
||||
Ac_Activate((ac_temperature - 1), ac_flow, ac_heat);
|
||||
break;
|
||||
case 'c':
|
||||
ac_heat = 0;
|
||||
Ac_Activate(ac_temperature, ac_flow, ac_heat);
|
||||
break;
|
||||
case 'h':
|
||||
ac_heat = 1;
|
||||
Ac_Activate(ac_temperature, ac_flow, ac_heat);
|
||||
break;
|
||||
case 'm':
|
||||
/*
|
||||
if ac is on, 1) turn off, 2) turn on Ac_Air_Clean(1)
|
||||
if ac is off, 1) turn on, 2) turn off Ac_Air_Clean(0)
|
||||
*/
|
||||
if (ac_power_on == 1) {
|
||||
Ac_Power_Down();
|
||||
delay(100);
|
||||
Ac_Air_Clean(1);
|
||||
} else {
|
||||
if (ac_air_clean_state == 1) {
|
||||
Ac_Air_Clean(0);
|
||||
delay(100);
|
||||
}
|
||||
Ac_Activate(ac_temperature, ac_flow, ac_heat);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
delay(100);
|
||||
Serial.println("ac_temperature");
|
||||
Serial.println(ac_temperature);
|
||||
Serial.println("ac_flow");
|
||||
Serial.println(ac_flow);
|
||||
Serial.println("ac_heat");
|
||||
Serial.println(ac_heat);
|
||||
Serial.println("ac_power_on");
|
||||
Serial.println(ac_power_on);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,58 @@
|
||||
/* Copyright 2017 crankyoldgit
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <ir_Argo.h>
|
||||
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRArgoAC argoir(kIrLed); // Set the GPIO to be used to sending the message.
|
||||
|
||||
void setup() {
|
||||
argoir.begin();
|
||||
Serial.begin(115200);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
Serial.println("Sending...");
|
||||
|
||||
// Set up what we want to send. See ir_Argo.cpp for all the options.
|
||||
argoir.setPower(true);
|
||||
argoir.setFan(ARGO_FAN_1);
|
||||
argoir.setCoolMode(ARGO_COOL_AUTO);
|
||||
argoir.setTemp(25);
|
||||
|
||||
#if SEND_ARGO
|
||||
// Now send the IR signal.
|
||||
argoir.send();
|
||||
#else // SEND_ARGO
|
||||
Serial.println("Can't send because SEND_ARGO has been disabled.");
|
||||
#endif // SEND_ARGO
|
||||
|
||||
delay(5000);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,27 +1,69 @@
|
||||
/* Copyright 2017 sillyfrog
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#include <IRDaikinESP.h>
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <ir_Daikin.h>
|
||||
|
||||
IRDaikinESP dakinir(D1);
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRDaikinESP daikinir(kIrLed); // Set the GPIO to be used to sending the message
|
||||
|
||||
void setup(){
|
||||
dakinir.begin();
|
||||
void setup() {
|
||||
daikinir.begin();
|
||||
Serial.begin(115200);
|
||||
}
|
||||
|
||||
|
||||
void loop(){
|
||||
void loop() {
|
||||
Serial.println("Sending...");
|
||||
|
||||
// Set up what we want to send. See IRDaikinESP.cpp for all the options.
|
||||
dakinir.on();
|
||||
dakinir.setFan(1);
|
||||
dakinir.setMode(DAIKIN_COOL);
|
||||
dakinir.setTemp(25);
|
||||
dakinir.setSwingVertical(0);
|
||||
dakinir.setSwingHorizontal(0);
|
||||
// Set up what we want to send. See ir_Daikin.cpp for all the options.
|
||||
daikinir.on();
|
||||
daikinir.setFan(1);
|
||||
daikinir.setMode(kDaikinCool);
|
||||
daikinir.setTemp(25);
|
||||
daikinir.setSwingVertical(false);
|
||||
daikinir.setSwingHorizontal(false);
|
||||
|
||||
// Set the current time to 1:33PM (13:33)
|
||||
// Time works in minutes past midnight
|
||||
daikinir.setCurrentTime((13*60) + 33);
|
||||
// Turn off about 1 hour later at 2:30PM (15:30)
|
||||
daikinir.enableOffTimer((14*60) + 30);
|
||||
|
||||
// Display what we are going to send.
|
||||
Serial.println(daikinir.toString());
|
||||
|
||||
// Now send the IR signal.
|
||||
dakinir.send();
|
||||
#if SEND_DAIKIN
|
||||
daikinir.send();
|
||||
#endif // SEND_DAIKIN
|
||||
|
||||
delay(5000);
|
||||
delay(15000);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,49 @@
|
||||
// Copyright 2017 Jonny Graham
|
||||
#include <IRsend.h>
|
||||
#include <ir_Fujitsu.h>
|
||||
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRFujitsuAC fujitsu(kIrLed);
|
||||
|
||||
void printState() {
|
||||
// Display the settings.
|
||||
Serial.println("Fujitsu A/C remote is in the following state:");
|
||||
Serial.printf(" Command:%d, Mode: %d, Temp: %dC, Fan Speed: %d," \
|
||||
" Swing Mode: %d\n",
|
||||
fujitsu.getCmd(), fujitsu.getMode(), fujitsu.getTemp(),
|
||||
fujitsu.getFanSpeed(), fujitsu.getSwing());
|
||||
// Display the encoded IR sequence.
|
||||
unsigned char* ir_code = fujitsu.getRaw();
|
||||
Serial.print("IR Code: 0x");
|
||||
for (uint8_t i = 0; i < fujitsu.getStateLength(); i++)
|
||||
Serial.printf("%02X", ir_code[i]);
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
fujitsu.begin();
|
||||
Serial.begin(115200);
|
||||
delay(200);
|
||||
|
||||
// Set up what we want to send. See ir_Fujitsu.cpp for all the options.
|
||||
Serial.println("Default state of the remote.");
|
||||
printState();
|
||||
Serial.println("Setting desired state for A/C.");
|
||||
fujitsu.setCmd(FUJITSU_AC_CMD_TURN_ON);
|
||||
fujitsu.setSwing(FUJITSU_AC_SWING_BOTH);
|
||||
fujitsu.setMode(FUJITSU_AC_MODE_COOL);
|
||||
fujitsu.setFanSpeed(FUJITSU_AC_FAN_HIGH);
|
||||
fujitsu.setTemp(24);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Now send the IR signal.
|
||||
Serial.println("Sending IR command to A/C ...");
|
||||
#if SEND_FUJITSU_AC
|
||||
fujitsu.send();
|
||||
#else // SEND_FUJITSU_AC
|
||||
Serial.println("Can't send because SEND_FUJITSU_AC has been disabled.");
|
||||
#endif // SEND_FUJITSU_AC
|
||||
printState();
|
||||
delay(5000);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,7 +1,37 @@
|
||||
/* Copyright 2016 David Conran
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <ir_Kelvinator.h>
|
||||
|
||||
#include <IRKelvinator.h>
|
||||
|
||||
IRKelvinatorAC kelvir(D1); // IR led controlled by Pin D1.
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRKelvinatorAC kelvir(kIrLed); // Set the GPIO to be used for sending messages.
|
||||
|
||||
void printState() {
|
||||
// Display the settings.
|
||||
@@ -17,17 +47,17 @@ void printState() {
|
||||
// Display the encoded IR sequence.
|
||||
unsigned char* ir_code = kelvir.getRaw();
|
||||
Serial.print("IR Code: 0x");
|
||||
for (int i = 0; i < KELVINATOR_STATE_LENGTH; i++)
|
||||
for (uint8_t i = 0; i < kKelvinatorStateLength; i++)
|
||||
Serial.printf("%02X", ir_code[i]);
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void setup(){
|
||||
void setup() {
|
||||
kelvir.begin();
|
||||
Serial.begin(115200);
|
||||
delay(200);
|
||||
|
||||
// Set up what we want to send. See IRKelvinator.cpp for all the options.
|
||||
// Set up what we want to send. See ir_Kelvinator.cpp for all the options.
|
||||
// Most things default to off.
|
||||
Serial.println("Default state of the remote.");
|
||||
printState();
|
||||
@@ -45,8 +75,10 @@ void setup(){
|
||||
|
||||
void loop() {
|
||||
// Now send the IR signal.
|
||||
#if SEND_KELVINATOR
|
||||
Serial.println("Sending IR command to A/C ...");
|
||||
kelvir.send();
|
||||
#endif // SEND_KELVINATOR
|
||||
printState();
|
||||
delay(5000);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -1,28 +1,59 @@
|
||||
/* Copyright 2017 David Conran
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <ir_Mitsubishi.h>
|
||||
|
||||
#include <IRMitsubishiAC.h>
|
||||
|
||||
IRMitsubishiAC mitsubir(D1); // IR led controlled by Pin D1.
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRMitsubishiAC mitsubir(kIrLed); // Set the GPIO used for sending messages.
|
||||
|
||||
void printState() {
|
||||
// Display the settings.
|
||||
Serial.println("Mitsubishi A/C remote is in the following state:");
|
||||
Serial.printf(" Power: %d, Mode: %d, Temp: %dC, Fan Speed: %d, Vane Mode: %d\n",
|
||||
Serial.printf(" Power: %d, Mode: %d, Temp: %dC, Fan Speed: %d," \
|
||||
" Vane Mode: %d\n",
|
||||
mitsubir.getPower(), mitsubir.getMode(), mitsubir.getTemp(),
|
||||
mitsubir.getFan(), mitsubir.getVane());
|
||||
// Display the encoded IR sequence.
|
||||
unsigned char* ir_code = mitsubir.getRaw();
|
||||
Serial.print("IR Code: 0x");
|
||||
for (int i = 0; i < MITSUBISHI_AC_STATE_LENGTH; i++)
|
||||
for (uint8_t i = 0; i < kMitsubishiACStateLength; i++)
|
||||
Serial.printf("%02X", ir_code[i]);
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void setup(){
|
||||
void setup() {
|
||||
mitsubir.begin();
|
||||
Serial.begin(115200);
|
||||
delay(200);
|
||||
|
||||
// Set up what we want to send. See IRMitsubishiAC.cpp for all the options.
|
||||
// Set up what we want to send. See ir_Mitsubishi.cpp for all the options.
|
||||
Serial.println("Default state of the remote.");
|
||||
printState();
|
||||
Serial.println("Setting desired state for A/C.");
|
||||
@@ -35,8 +66,10 @@ void setup(){
|
||||
|
||||
void loop() {
|
||||
// Now send the IR signal.
|
||||
#if SEND_MITSUBISHI_AC
|
||||
Serial.println("Sending IR command to A/C ...");
|
||||
mitsubir.send();
|
||||
#endif // SEND_MITSUBISHI_AC
|
||||
printState();
|
||||
delay(5000);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,73 @@
|
||||
/* Copyright 2017 David Conran
|
||||
*
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <ir_Toshiba.h>
|
||||
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRToshibaAC toshibair(kIrLed); // Set the GPIO to be used for sending messages.
|
||||
|
||||
void printState() {
|
||||
// Display the settings.
|
||||
Serial.println("Toshiba A/C remote is in the following state:");
|
||||
Serial.printf(" Power: %d, Mode: %d, Temp: %dC, Fan Speed: %d\n",
|
||||
toshibair.getPower(), toshibair.getMode(), toshibair.getTemp(),
|
||||
toshibair.getFan());
|
||||
// Display the encoded IR sequence.
|
||||
unsigned char* ir_code = toshibair.getRaw();
|
||||
Serial.print("IR Code: 0x");
|
||||
for (uint8_t i = 0; i < kToshibaACStateLength; i++)
|
||||
Serial.printf("%02X", ir_code[i]);
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
toshibair.begin();
|
||||
Serial.begin(115200);
|
||||
delay(200);
|
||||
|
||||
// Set up what we want to send. See ir_Toshiba.cpp for all the options.
|
||||
Serial.println("Default state of the remote.");
|
||||
printState();
|
||||
Serial.println("Setting desired state for A/C.");
|
||||
toshibair.on();
|
||||
toshibair.setFan(1);
|
||||
toshibair.setMode(TOSHIBA_AC_COOL);
|
||||
toshibair.setTemp(26);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Now send the IR signal.
|
||||
#if SEND_TOSHIBA_AC
|
||||
Serial.println("Sending IR command to A/C ...");
|
||||
toshibair.send();
|
||||
#endif // SEND_TOSHIBA_AC
|
||||
printState();
|
||||
delay(5000);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,58 @@
|
||||
/* Copyright 2017 stufisher
|
||||
* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
|
||||
* as specified by kIrLed below.
|
||||
*
|
||||
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
|
||||
*
|
||||
* Suggested circuit:
|
||||
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Typical digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*/
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRsend.h>
|
||||
#include <ir_Trotec.h>
|
||||
|
||||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||||
IRTrotecESP trotecir(kIrLed); // Set the GPIO to be used for sending messages.
|
||||
|
||||
void setup() {
|
||||
trotecir.begin();
|
||||
Serial.begin(115200);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
Serial.println("Sending...");
|
||||
|
||||
// Set up what we want to send. See ir_Trotec.cpp for all the options.
|
||||
trotecir.setPower(true);
|
||||
trotecir.setSpeed(TROTEC_FAN_LOW);
|
||||
trotecir.setMode(TROTEC_COOL);
|
||||
trotecir.setTemp(25);
|
||||
|
||||
// Now send the IR signal.
|
||||
#if SEND_TROTEC
|
||||
trotecir.send();
|
||||
#else // SEND_TROTEC
|
||||
Serial.println("Can't send because SEND_TROTEC has been disabled.");
|
||||
#endif // SEND_TROTEC
|
||||
|
||||
delay(5000);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = ../../
|
||||
src_dir=.
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
+1616
-39
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "IRremoteESP8266",
|
||||
"version": "1.2.0",
|
||||
"version": "2.5.2",
|
||||
"keywords": "infrared, ir, remote, esp8266",
|
||||
"description": "Send and receive infrared signals with multiple protocols (ESP8266)",
|
||||
"repository":
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name=IRremoteESP8266
|
||||
version=1.2.0
|
||||
version=2.5.2
|
||||
author=Sebastien Warin, Mark Szabo, Ken Shirriff, David Conran
|
||||
maintainer=Mark Szabo, David Conran, Sebastien Warin, Roi Dayan, Massimiliano Pinto
|
||||
sentence=Send and receive infrared signals with multiple protocols (ESP8266)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
[platformio]
|
||||
lib_extra_dirs = .
|
||||
src_dir = examples/IRrecvDumpV2
|
||||
|
||||
[common]
|
||||
build_flags =
|
||||
lib_deps_builtin =
|
||||
lib_deps_external =
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = nodemcuv2
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
|
||||
[env:d1_mini]
|
||||
platform = espressif8266
|
||||
framework = arduino
|
||||
board = d1_mini
|
||||
build_flags = ${common.build_flags}
|
||||
lib_deps =
|
||||
${common.lib_deps_builtin}
|
||||
${common.lib_deps_external}
|
||||
@@ -0,0 +1,12 @@
|
||||
[REPORTS]
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=no
|
||||
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=80
|
||||
|
||||
# String used as indentation unit.
|
||||
indent-string=' '
|
||||
@@ -0,0 +1 @@
|
||||
filter=-build/include,+build/include_alpha,+build/include_order,+build/include_what_you_use
|
||||
@@ -0,0 +1,734 @@
|
||||
// Copyright 2009 Ken Shirriff
|
||||
// Copyright 2015 Mark Szabo
|
||||
// Copyright 2015 Sebastien Warin
|
||||
// Copyright 2017 David Conran
|
||||
|
||||
#include "IRrecv.h"
|
||||
#include <stddef.h>
|
||||
#ifndef UNIT_TEST
|
||||
extern "C" {
|
||||
#include <gpio.h>
|
||||
#include <user_interface.h>
|
||||
}
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <algorithm>
|
||||
#include "IRremoteESP8266.h"
|
||||
#include "IRutils.h"
|
||||
|
||||
#ifdef UNIT_TEST
|
||||
#undef ICACHE_RAM_ATTR
|
||||
#define ICACHE_RAM_ATTR
|
||||
#endif
|
||||
// Updated by Sebastien Warin (http://sebastien.warin.fr) for receiving IR code
|
||||
// on ESP8266
|
||||
// Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for
|
||||
// sending IR code on ESP8266
|
||||
|
||||
// Globals
|
||||
#ifndef UNIT_TEST
|
||||
static ETSTimer timer;
|
||||
#endif
|
||||
volatile irparams_t irparams;
|
||||
irparams_t *irparams_save; // A copy of the interrupt state while decoding.
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
static void ICACHE_RAM_ATTR read_timeout(void *arg __attribute__((unused))) {
|
||||
os_intr_lock();
|
||||
if (irparams.rawlen) irparams.rcvstate = kStopState;
|
||||
os_intr_unlock();
|
||||
}
|
||||
|
||||
static void ICACHE_RAM_ATTR gpio_intr() {
|
||||
uint32_t now = system_get_time();
|
||||
uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
|
||||
static uint32_t start = 0;
|
||||
|
||||
os_timer_disarm(&timer);
|
||||
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
|
||||
|
||||
// Grab a local copy of rawlen to reduce instructions used in IRAM.
|
||||
// This is an ugly premature optimisation code-wise, but we do everything we
|
||||
// can to save IRAM.
|
||||
// It seems referencing the value via the structure uses more instructions.
|
||||
// Less instructions means faster and less IRAM used.
|
||||
// N.B. It saves about 13 bytes of IRAM.
|
||||
uint16_t rawlen = irparams.rawlen;
|
||||
|
||||
if (rawlen >= irparams.bufsize) {
|
||||
irparams.overflow = true;
|
||||
irparams.rcvstate = kStopState;
|
||||
}
|
||||
|
||||
if (irparams.rcvstate == kStopState) return;
|
||||
|
||||
if (irparams.rcvstate == kIdleState) {
|
||||
irparams.rcvstate = kMarkState;
|
||||
irparams.rawbuf[rawlen] = 1;
|
||||
} else {
|
||||
if (now < start)
|
||||
irparams.rawbuf[rawlen] = (UINT32_MAX - start + now) / kRawTick;
|
||||
else
|
||||
irparams.rawbuf[rawlen] = (now - start) / kRawTick;
|
||||
}
|
||||
irparams.rawlen++;
|
||||
|
||||
start = now;
|
||||
#define ONCE 0
|
||||
os_timer_arm(&timer, irparams.timeout, ONCE);
|
||||
}
|
||||
#endif // UNIT_TEST
|
||||
|
||||
// Start of IRrecv class -------------------
|
||||
|
||||
// Class constructor
|
||||
// Args:
|
||||
// recvpin: GPIO pin the IR receiver module's data pin is connected to.
|
||||
// bufsize: Nr. of entries to have in the capture buffer. (Default: kRawBuf)
|
||||
// timeout: Nr. of milli-Seconds of no signal before we stop capturing data.
|
||||
// (Default: kTimeoutMs)
|
||||
// save_buffer: Use a second (save) buffer to decode from. (Def: false)
|
||||
// Returns:
|
||||
// An IRrecv class object.
|
||||
IRrecv::IRrecv(uint16_t recvpin, uint16_t bufsize, uint8_t timeout,
|
||||
bool save_buffer) {
|
||||
irparams.recvpin = recvpin;
|
||||
irparams.bufsize = bufsize;
|
||||
// Ensure we are going to be able to store all possible values in the
|
||||
// capture buffer.
|
||||
irparams.timeout = std::min(timeout, (uint8_t)kMaxTimeoutMs);
|
||||
irparams.rawbuf = new uint16_t[bufsize];
|
||||
if (irparams.rawbuf == NULL) {
|
||||
DPRINTLN(
|
||||
"Could not allocate memory for the primary IR buffer.\n"
|
||||
"Try a smaller size for CAPTURE_BUFFER_SIZE.\nRebooting!");
|
||||
#ifndef UNIT_TEST
|
||||
ESP.restart(); // Mem alloc failure. Reboot.
|
||||
#endif
|
||||
}
|
||||
// If we have been asked to use a save buffer (for decoding), then create one.
|
||||
if (save_buffer) {
|
||||
irparams_save = new irparams_t;
|
||||
irparams_save->rawbuf = new uint16_t[bufsize];
|
||||
// Check we allocated the memory successfully.
|
||||
if (irparams_save->rawbuf == NULL) {
|
||||
DPRINTLN(
|
||||
"Could not allocate memory for the second IR buffer.\n"
|
||||
"Try a smaller size for CAPTURE_BUFFER_SIZE.\nRebooting!");
|
||||
#ifndef UNIT_TEST
|
||||
ESP.restart(); // Mem alloc failure. Reboot.
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
irparams_save = NULL;
|
||||
}
|
||||
#if DECODE_HASH
|
||||
unknown_threshold = kUnknownThreshold;
|
||||
#endif // DECODE_HASH
|
||||
}
|
||||
|
||||
// Class destructor
|
||||
IRrecv::~IRrecv(void) {
|
||||
delete[] irparams.rawbuf;
|
||||
if (irparams_save != NULL) {
|
||||
delete[] irparams_save->rawbuf;
|
||||
delete irparams_save;
|
||||
}
|
||||
}
|
||||
|
||||
// initialization
|
||||
void IRrecv::enableIRIn() {
|
||||
// initialize state machine variables
|
||||
resume();
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
// Initialize timer
|
||||
os_timer_disarm(&timer);
|
||||
os_timer_setfn(&timer, reinterpret_cast<os_timer_func_t *>(read_timeout),
|
||||
NULL);
|
||||
|
||||
// Attach Interrupt
|
||||
attachInterrupt(irparams.recvpin, gpio_intr, CHANGE);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IRrecv::disableIRIn() {
|
||||
#ifndef UNIT_TEST
|
||||
os_timer_disarm(&timer);
|
||||
detachInterrupt(irparams.recvpin);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IRrecv::resume() {
|
||||
irparams.rcvstate = kIdleState;
|
||||
irparams.rawlen = 0;
|
||||
irparams.overflow = false;
|
||||
}
|
||||
|
||||
// Make a copy of the interrupt state & buffer data.
|
||||
// Needed because irparams is marked as volatile, thus memcpy() isn't allowed.
|
||||
// Only call this when you know the interrupt handlers won't modify anything.
|
||||
// i.e. In kStopState.
|
||||
//
|
||||
// Args:
|
||||
// src: Pointer to an irparams_t structure to copy from.
|
||||
// dst: Pointer to an irparams_t structure to copy to.
|
||||
void IRrecv::copyIrParams(volatile irparams_t *src, irparams_t *dst) {
|
||||
// Typecast src and dst addresses to (char *)
|
||||
char *csrc = (char *)src; // NOLINT(readability/casting)
|
||||
char *cdst = (char *)dst; // NOLINT(readability/casting)
|
||||
|
||||
// Save the pointer to the destination's rawbuf so we don't lose it as
|
||||
// the for-loop/copy after this will overwrite it with src's rawbuf pointer.
|
||||
// This isn't immediately obvious due to typecasting/different variable names.
|
||||
uint16_t *dst_rawbuf_ptr;
|
||||
dst_rawbuf_ptr = dst->rawbuf;
|
||||
|
||||
// Copy contents of src[] to dst[]
|
||||
for (uint16_t i = 0; i < sizeof(irparams_t); i++) cdst[i] = csrc[i];
|
||||
|
||||
// Restore the buffer pointer
|
||||
dst->rawbuf = dst_rawbuf_ptr;
|
||||
|
||||
// Copy the rawbuf
|
||||
for (uint16_t i = 0; i < dst->bufsize; i++) dst->rawbuf[i] = src->rawbuf[i];
|
||||
}
|
||||
|
||||
// Obtain the maximum number of entries possible in the capture buffer.
|
||||
// i.e. It's size.
|
||||
uint16_t IRrecv::getBufSize() { return irparams.bufsize; }
|
||||
|
||||
#if DECODE_HASH
|
||||
// Set the minimum length we will consider for reporting UNKNOWN message types.
|
||||
void IRrecv::setUnknownThreshold(uint16_t length) {
|
||||
unknown_threshold = length;
|
||||
}
|
||||
#endif // DECODE_HASH
|
||||
|
||||
// Decodes the received IR message.
|
||||
// If the interrupt state is saved, we will immediately resume waiting
|
||||
// for the next IR message to avoid missing messages.
|
||||
// Note: There is a trade-off here. Saving the state means less time lost until
|
||||
// we can receiving the next message vs. using more RAM. Choose appropriately.
|
||||
//
|
||||
// Args:
|
||||
// results: A pointer to where the decoded IR message will be stored.
|
||||
// save: A pointer to an irparams_t instance in which to save
|
||||
// the interrupt's memory/state. NULL means don't save it.
|
||||
// Returns:
|
||||
// A boolean indicating if an IR message is ready or not.
|
||||
bool IRrecv::decode(decode_results *results, irparams_t *save) {
|
||||
// Proceed only if an IR message been received.
|
||||
#ifndef UNIT_TEST
|
||||
if (irparams.rcvstate != kStopState) return false;
|
||||
#endif
|
||||
|
||||
// Clear the entry we are currently pointing to when we got the timeout.
|
||||
// i.e. Stopped collecting IR data.
|
||||
// It's junk as we never wrote an entry to it and can only confuse decoding.
|
||||
// This is done here rather than logically the best place in read_timeout()
|
||||
// as it saves a few bytes of ICACHE_RAM as that routine is bound to an
|
||||
// interrupt. decode() is not stored in ICACHE_RAM.
|
||||
// Another better option would be to zero the entire irparams.rawbuf[] on
|
||||
// resume() but that is a much more expensive operation compare to this.
|
||||
irparams.rawbuf[irparams.rawlen] = 0;
|
||||
|
||||
bool resumed = false; // Flag indicating if we have resumed.
|
||||
|
||||
// If we were requested to use a save buffer previously, do so.
|
||||
if (save == NULL) save = irparams_save;
|
||||
|
||||
if (save == NULL) {
|
||||
// We haven't been asked to copy it so use the existing memory.
|
||||
#ifndef UNIT_TEST
|
||||
results->rawbuf = irparams.rawbuf;
|
||||
results->rawlen = irparams.rawlen;
|
||||
results->overflow = irparams.overflow;
|
||||
#endif
|
||||
} else {
|
||||
copyIrParams(&irparams, save); // Duplicate the interrupt's memory.
|
||||
resume(); // It's now safe to rearm. The IR message won't be overridden.
|
||||
resumed = true;
|
||||
// Point the results at the saved copy.
|
||||
results->rawbuf = save->rawbuf;
|
||||
results->rawlen = save->rawlen;
|
||||
results->overflow = save->overflow;
|
||||
}
|
||||
|
||||
// Reset any previously partially processed results.
|
||||
results->decode_type = UNKNOWN;
|
||||
results->bits = 0;
|
||||
results->value = 0;
|
||||
results->address = 0;
|
||||
results->command = 0;
|
||||
results->repeat = false;
|
||||
|
||||
#if DECODE_AIWA_RC_T501
|
||||
DPRINTLN("Attempting Aiwa RC T501 decode");
|
||||
// Try decodeAiwaRCT501() before decodeSanyoLC7461() & decodeNEC()
|
||||
// because the protocols are similar. This protocol is more specific than
|
||||
// those ones, so should got before them.
|
||||
if (decodeAiwaRCT501(results)) return true;
|
||||
#endif
|
||||
#if DECODE_SANYO
|
||||
DPRINTLN("Attempting Sanyo LC7461 decode");
|
||||
// Try decodeSanyoLC7461() before decodeNEC() because the protocols are
|
||||
// similar in timings & structure, but the Sanyo one is much longer than the
|
||||
// NEC protocol (42 vs 32 bits) so this one should be tried first to try to
|
||||
// reduce false detection as a NEC packet.
|
||||
if (decodeSanyoLC7461(results)) return true;
|
||||
#endif
|
||||
#if DECODE_CARRIER_AC
|
||||
DPRINTLN("Attempting Carrier AC decode");
|
||||
// Try decodeCarrierAC() before decodeNEC() because the protocols are
|
||||
// similar in timings & structure, but the Carrier one is much longer than the
|
||||
// NEC protocol (3x32 bits vs 1x32 bits) so this one should be tried first to
|
||||
// try to reduce false detection as a NEC packet.
|
||||
if (decodeCarrierAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_PIONEER
|
||||
DPRINTLN("Attempting Pioneer decode");
|
||||
// Try decodePioneer() before decodeNEC() because the protocols are
|
||||
// similar in timings & structure, but the Pioneer one is much longer than the
|
||||
// NEC protocol (2x32 bits vs 1x32 bits) so this one should be tried first to
|
||||
// try to reduce false detection as a NEC packet.
|
||||
if (decodePioneer(results)) return true;
|
||||
#endif
|
||||
#if DECODE_NEC
|
||||
DPRINTLN("Attempting NEC decode");
|
||||
if (decodeNEC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_SONY
|
||||
DPRINTLN("Attempting Sony decode");
|
||||
if (decodeSony(results)) return true;
|
||||
#endif
|
||||
#if DECODE_MITSUBISHI
|
||||
DPRINTLN("Attempting Mitsubishi decode");
|
||||
if (decodeMitsubishi(results)) return true;
|
||||
#endif
|
||||
#if DECODE_MITSUBISHI_AC
|
||||
DPRINTLN("Attempting Mitsubishi AC decode");
|
||||
if (decodeMitsubishiAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_MITSUBISHI2
|
||||
DPRINTLN("Attempting Mitsubishi2 decode");
|
||||
if (decodeMitsubishi2(results)) return true;
|
||||
#endif
|
||||
#if DECODE_RC5
|
||||
DPRINTLN("Attempting RC5 decode");
|
||||
if (decodeRC5(results)) return true;
|
||||
#endif
|
||||
#if DECODE_RC6
|
||||
DPRINTLN("Attempting RC6 decode");
|
||||
if (decodeRC6(results)) return true;
|
||||
#endif
|
||||
#if DECODE_RCMM
|
||||
DPRINTLN("Attempting RC-MM decode");
|
||||
if (decodeRCMM(results)) return true;
|
||||
#endif
|
||||
#if DECODE_FUJITSU_AC
|
||||
// Fujitsu A/C needs to precede Panasonic and Denon as it has a short
|
||||
// message which looks exactly the same as a Panasonic/Denon message.
|
||||
DPRINTLN("Attempting Fujitsu A/C decode");
|
||||
if (decodeFujitsuAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_DENON
|
||||
// Denon needs to precede Panasonic as it is a special case of Panasonic.
|
||||
DPRINTLN("Attempting Denon decode");
|
||||
if (decodeDenon(results, DENON_48_BITS) || decodeDenon(results, DENON_BITS) ||
|
||||
decodeDenon(results, kDenonLegacyBits))
|
||||
return true;
|
||||
#endif
|
||||
#if DECODE_PANASONIC
|
||||
DPRINTLN("Attempting Panasonic decode");
|
||||
if (decodePanasonic(results)) return true;
|
||||
#endif
|
||||
#if DECODE_LG
|
||||
DPRINTLN("Attempting LG (28-bit) decode");
|
||||
if (decodeLG(results, kLgBits, true)) return true;
|
||||
DPRINTLN("Attempting LG (32-bit) decode");
|
||||
// LG32 should be tried before Samsung
|
||||
if (decodeLG(results, kLg32Bits, true)) return true;
|
||||
#endif
|
||||
#if DECODE_GICABLE
|
||||
// Note: Needs to happen before JVC decode, because it looks similar except
|
||||
// with a required NEC-like repeat code.
|
||||
DPRINTLN("Attempting GICable decode");
|
||||
if (decodeGICable(results)) return true;
|
||||
#endif
|
||||
#if DECODE_JVC
|
||||
DPRINTLN("Attempting JVC decode");
|
||||
if (decodeJVC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_SAMSUNG
|
||||
DPRINTLN("Attempting SAMSUNG decode");
|
||||
if (decodeSAMSUNG(results)) return true;
|
||||
#endif
|
||||
#if DECODE_WHYNTER
|
||||
DPRINTLN("Attempting Whynter decode");
|
||||
if (decodeWhynter(results)) return true;
|
||||
#endif
|
||||
#if DECODE_DISH
|
||||
DPRINTLN("Attempting DISH decode");
|
||||
if (decodeDISH(results)) return true;
|
||||
#endif
|
||||
#if DECODE_SHARP
|
||||
DPRINTLN("Attempting Sharp decode");
|
||||
if (decodeSharp(results)) return true;
|
||||
#endif
|
||||
#if DECODE_COOLIX
|
||||
DPRINTLN("Attempting Coolix decode");
|
||||
if (decodeCOOLIX(results)) return true;
|
||||
#endif
|
||||
#if DECODE_NIKAI
|
||||
DPRINTLN("Attempting Nikai decode");
|
||||
if (decodeNikai(results)) return true;
|
||||
#endif
|
||||
#if DECODE_KELVINATOR
|
||||
// Kelvinator based-devices use a similar code to Gree ones, to avoid false
|
||||
// matches this needs to happen before decodeGree().
|
||||
DPRINTLN("Attempting Kelvinator decode");
|
||||
if (decodeKelvinator(results)) return true;
|
||||
#endif
|
||||
#if DECODE_DAIKIN
|
||||
DPRINTLN("Attempting Daikin decode");
|
||||
if (decodeDaikin(results)) return true;
|
||||
#endif
|
||||
#if DECODE_TOSHIBA_AC
|
||||
DPRINTLN("Attempting Toshiba AC decode");
|
||||
if (decodeToshibaAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_MIDEA
|
||||
DPRINTLN("Attempting Midea decode");
|
||||
if (decodeMidea(results)) return true;
|
||||
#endif
|
||||
#if DECODE_MAGIQUEST
|
||||
DPRINTLN("Attempting Magiquest decode");
|
||||
if (decodeMagiQuest(results)) return true;
|
||||
#endif
|
||||
/* NOTE: Disabled due to poor quality.
|
||||
#if DECODE_SANYO
|
||||
// The Sanyo S866500B decoder is very poor quality & depricated.
|
||||
// *IF* you are going to enable it, do it near last to avoid false positive
|
||||
// matches.
|
||||
DPRINTLN("Attempting Sanyo SA8650B decode");
|
||||
if (decodeSanyo(results))
|
||||
return true;
|
||||
#endif
|
||||
*/
|
||||
#if DECODE_NEC
|
||||
// Some devices send NEC-like codes that don't follow the true NEC spec.
|
||||
// This should detect those. e.g. Apple TV remote etc.
|
||||
// This needs to be done after all other codes that use strict and some
|
||||
// other protocols that are NEC-like as well, as turning off strict may
|
||||
// cause this to match other valid protocols.
|
||||
DPRINTLN("Attempting NEC (non-strict) decode");
|
||||
if (decodeNEC(results, kNECBits, false)) {
|
||||
results->decode_type = NEC_LIKE;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#if DECODE_LASERTAG
|
||||
DPRINTLN("Attempting Lasertag decode");
|
||||
if (decodeLasertag(results)) return true;
|
||||
#endif
|
||||
#if DECODE_GREE
|
||||
// Gree based-devices use a similar code to Kelvinator ones, to avoid false
|
||||
// matches this needs to happen after decodeKelvinator().
|
||||
DPRINTLN("Attempting Gree decode");
|
||||
if (decodeGree(results)) return true;
|
||||
#endif
|
||||
#if DECODE_HAIER_AC
|
||||
DPRINTLN("Attempting Haier AC decode");
|
||||
if (decodeHaierAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_HAIER_AC_YRW02
|
||||
DPRINTLN("Attempting Haier AC YR-W02 decode");
|
||||
if (decodeHaierACYRW02(results)) return true;
|
||||
#endif
|
||||
#if DECODE_HITACHI_AC2
|
||||
// HitachiAC2 should be checked before HitachiAC
|
||||
DPRINTLN("Attempting Hitachi AC2 decode");
|
||||
if (decodeHitachiAC(results, kHitachiAc2Bits)) return true;
|
||||
#endif
|
||||
#if DECODE_HITACHI_AC
|
||||
DPRINTLN("Attempting Hitachi AC decode");
|
||||
if (decodeHitachiAC(results, kHitachiAcBits)) return true;
|
||||
#endif
|
||||
#if DECODE_HITACHI_AC1
|
||||
DPRINTLN("Attempting Hitachi AC1 decode");
|
||||
if (decodeHitachiAC(results, kHitachiAc1Bits)) return true;
|
||||
#endif
|
||||
#if DECODE_WHIRLPOOL_AC
|
||||
DPRINTLN("Attempting Whirlpool AC decode");
|
||||
if (decodeWhirlpoolAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_SAMSUNG_AC
|
||||
DPRINTLN("Attempting Samsung AC (extended) decode");
|
||||
// Check the extended size first, as it should fail fast due to longer length.
|
||||
if (decodeSamsungAC(results, kSamsungAcExtendedBits, false)) return true;
|
||||
// Now check for the more common length.
|
||||
DPRINTLN("Attempting Samsung AC decode");
|
||||
if (decodeSamsungAC(results, kSamsungAcBits)) return true;
|
||||
#endif
|
||||
#if DECODE_ELECTRA_AC
|
||||
DPRINTLN("Attempting Electra AC decode");
|
||||
if (decodeElectraAC(results)) return true;
|
||||
#endif
|
||||
#if DECODE_PANASONIC_AC
|
||||
DPRINTLN("Attempting Panasonic AC decode");
|
||||
if (decodePanasonicAC(results)) return true;
|
||||
DPRINTLN("Attempting Panasonic AC short decode");
|
||||
if (decodePanasonicAC(results, kPanasonicAcShortBits)) return true;
|
||||
#endif
|
||||
#if DECODE_LUTRON
|
||||
DPRINTLN("Attempting Lutron decode");
|
||||
if (decodeLutron(results)) return true;
|
||||
#endif
|
||||
#if DECODE_MWM
|
||||
DPRINTLN("Attempting MWM decode");
|
||||
if (decodeMWM(results)) return true;
|
||||
#endif
|
||||
#if DECODE_HASH
|
||||
// decodeHash returns a hash on any input.
|
||||
// Thus, it needs to be last in the list.
|
||||
// If you add any decodes, add them before this.
|
||||
if (decodeHash(results)) {
|
||||
return true;
|
||||
}
|
||||
#endif // DECODE_HASH
|
||||
// Throw away and start over
|
||||
if (!resumed) // Check if we have already resumed.
|
||||
resume();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Calculate the lower bound of the nr. of ticks.
|
||||
//
|
||||
// Args:
|
||||
// usecs: Nr. of uSeconds.
|
||||
// tolerance: Percent as an integer. e.g. 10 is 10%
|
||||
// delta: A non-scaling amount to reduce usecs by.
|
||||
// Returns:
|
||||
// Nr. of ticks.
|
||||
uint32_t IRrecv::ticksLow(uint32_t usecs, uint8_t tolerance, uint16_t delta) {
|
||||
// max() used to ensure the result can't drop below 0 before the cast.
|
||||
return ((uint32_t)std::max(
|
||||
(int32_t)(usecs * (1.0 - tolerance / 100.0) - delta), 0));
|
||||
}
|
||||
|
||||
// Calculate the upper bound of the nr. of ticks.
|
||||
//
|
||||
// Args:
|
||||
// usecs: Nr. of uSeconds.
|
||||
// tolerance: Percent as an integer. e.g. 10 is 10%
|
||||
// delta: A non-scaling amount to increase usecs by.
|
||||
// Returns:
|
||||
// Nr. of ticks.
|
||||
uint32_t IRrecv::ticksHigh(uint32_t usecs, uint8_t tolerance, uint16_t delta) {
|
||||
return ((uint32_t)(usecs * (1.0 + tolerance / 100.0)) + 1 + delta);
|
||||
}
|
||||
|
||||
// Check if we match a pulse(measured) with the desired within
|
||||
// +/-tolerance percent and/or +/- a fixed delta range.
|
||||
//
|
||||
// Args:
|
||||
// measured: The recorded period of the signal pulse.
|
||||
// desired: The expected period (in useconds) we are matching against.
|
||||
// tolerance: A percentage expressed as an integer. e.g. 10 is 10%.
|
||||
// delta: A non-scaling (+/-) error margin (in useconds).
|
||||
//
|
||||
// Returns:
|
||||
// Boolean: true if it matches, false if it doesn't.
|
||||
bool IRrecv::match(uint32_t measured, uint32_t desired, uint8_t tolerance,
|
||||
uint16_t delta) {
|
||||
measured *= kRawTick; // Convert to uSecs.
|
||||
DPRINT("Matching: ");
|
||||
DPRINT(ticksLow(desired, tolerance, delta));
|
||||
DPRINT(" <= ");
|
||||
DPRINT(measured);
|
||||
DPRINT(" <= ");
|
||||
DPRINTLN(ticksHigh(desired, tolerance, delta));
|
||||
return (measured >= ticksLow(desired, tolerance, delta) &&
|
||||
measured <= ticksHigh(desired, tolerance, delta));
|
||||
}
|
||||
|
||||
// Check if we match a pulse(measured) of at least desired within
|
||||
// tolerance percent and/or a fixed delta margin.
|
||||
//
|
||||
// Args:
|
||||
// measured: The recorded period of the signal pulse.
|
||||
// desired: The expected period (in useconds) we are matching against.
|
||||
// tolerance: A percentage expressed as an integer. e.g. 10 is 10%.
|
||||
// delta: A non-scaling amount to reduce usecs by.
|
||||
|
||||
//
|
||||
// Returns:
|
||||
// Boolean: true if it matches, false if it doesn't.
|
||||
bool IRrecv::matchAtLeast(uint32_t measured, uint32_t desired,
|
||||
uint8_t tolerance, uint16_t delta) {
|
||||
measured *= kRawTick; // Convert to uSecs.
|
||||
DPRINT("Matching ATLEAST ");
|
||||
DPRINT(measured);
|
||||
DPRINT(" vs ");
|
||||
DPRINT(desired);
|
||||
DPRINT(". Matching: ");
|
||||
DPRINT(measured);
|
||||
DPRINT(" >= ");
|
||||
DPRINT(ticksLow(std::min(desired, MS_TO_USEC(irparams.timeout)), tolerance,
|
||||
delta));
|
||||
DPRINT(" [min(");
|
||||
DPRINT(ticksLow(desired, tolerance, delta));
|
||||
DPRINT(", ");
|
||||
DPRINT(ticksLow(MS_TO_USEC(irparams.timeout), tolerance, delta));
|
||||
DPRINTLN(")]");
|
||||
// We really should never get a value of 0, except as the last value
|
||||
// in the buffer. If that is the case, then assume infinity and return true.
|
||||
if (measured == 0) return true;
|
||||
return measured >= ticksLow(std::min(desired, MS_TO_USEC(irparams.timeout)),
|
||||
tolerance, delta);
|
||||
}
|
||||
|
||||
// Check if we match a mark signal(measured) with the desired within
|
||||
// +/-tolerance percent, after an expected is excess is added.
|
||||
//
|
||||
// Args:
|
||||
// measured: The recorded period of the signal pulse.
|
||||
// desired: The expected period (in useconds) we are matching against.
|
||||
// tolerance: A percentage expressed as an integer. e.g. 10 is 10%.
|
||||
// excess: Nr. of useconds.
|
||||
//
|
||||
// Returns:
|
||||
// Boolean: true if it matches, false if it doesn't.
|
||||
bool IRrecv::matchMark(uint32_t measured, uint32_t desired, uint8_t tolerance,
|
||||
int16_t excess) {
|
||||
DPRINT("Matching MARK ");
|
||||
DPRINT(measured * kRawTick);
|
||||
DPRINT(" vs ");
|
||||
DPRINT(desired);
|
||||
DPRINT(" + ");
|
||||
DPRINT(excess);
|
||||
DPRINT(". ");
|
||||
return match(measured, desired + excess, tolerance);
|
||||
}
|
||||
|
||||
// Check if we match a space signal(measured) with the desired within
|
||||
// +/-tolerance percent, after an expected is excess is removed.
|
||||
//
|
||||
// Args:
|
||||
// measured: The recorded period of the signal pulse.
|
||||
// desired: The expected period (in useconds) we are matching against.
|
||||
// tolerance: A percentage expressed as an integer. e.g. 10 is 10%.
|
||||
// excess: Nr. of useconds.
|
||||
//
|
||||
// Returns:
|
||||
// Boolean: true if it matches, false if it doesn't.
|
||||
bool IRrecv::matchSpace(uint32_t measured, uint32_t desired, uint8_t tolerance,
|
||||
int16_t excess) {
|
||||
DPRINT("Matching SPACE ");
|
||||
DPRINT(measured * kRawTick);
|
||||
DPRINT(" vs ");
|
||||
DPRINT(desired);
|
||||
DPRINT(" - ");
|
||||
DPRINT(excess);
|
||||
DPRINT(". ");
|
||||
return match(measured, desired - excess, tolerance);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------
|
||||
* hashdecode - decode an arbitrary IR code.
|
||||
* Instead of decoding using a standard encoding scheme
|
||||
* (e.g. Sony, NEC, RC5), the code is hashed to a 32-bit value.
|
||||
*
|
||||
* The algorithm: look at the sequence of MARK signals, and see if each one
|
||||
* is shorter (0), the same length (1), or longer (2) than the previous.
|
||||
* Do the same with the SPACE signals. Hash the resulting sequence of 0's,
|
||||
* 1's, and 2's to a 32-bit value. This will give a unique value for each
|
||||
* different code (probably), for most code systems.
|
||||
*
|
||||
* http://arcfn.com/2010/01/using-arbitrary-remotes-with-arduino.html
|
||||
*/
|
||||
|
||||
// Compare two tick values, returning 0 if newval is shorter,
|
||||
// 1 if newval is equal, and 2 if newval is longer
|
||||
// Use a tolerance of 20%
|
||||
int16_t IRrecv::compare(uint16_t oldval, uint16_t newval) {
|
||||
if (newval < oldval * 0.8)
|
||||
return 0;
|
||||
else if (oldval < newval * 0.8)
|
||||
return 2;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if DECODE_HASH
|
||||
/* Converts the raw code values into a 32-bit hash code.
|
||||
* Hopefully this code is unique for each button.
|
||||
* This isn't a "real" decoding, just an arbitrary value.
|
||||
*/
|
||||
bool IRrecv::decodeHash(decode_results *results) {
|
||||
// Require at least some samples to prevent triggering on noise
|
||||
if (results->rawlen < unknown_threshold) return false;
|
||||
int32_t hash = kFnvBasis32;
|
||||
// 'rawlen - 2' to avoid the look ahead from going out of bounds.
|
||||
// Should probably be -3 to avoid comparing the trailing space entry,
|
||||
// however it is left this way for compatibility with previously captured
|
||||
// values.
|
||||
for (uint16_t i = 1; i < results->rawlen - 2; i++) {
|
||||
int16_t value = compare(results->rawbuf[i], results->rawbuf[i + 2]);
|
||||
// Add value into the hash
|
||||
hash = (hash * kFnvPrime32) ^ value;
|
||||
}
|
||||
results->value = hash & 0xFFFFFFFF;
|
||||
results->bits = results->rawlen / 2;
|
||||
results->address = 0;
|
||||
results->command = 0;
|
||||
results->decode_type = UNKNOWN;
|
||||
return true;
|
||||
}
|
||||
#endif // DECODE_HASH
|
||||
|
||||
// Match & decode the typical data section of an IR message.
|
||||
// The data value is stored in the least significant bits reguardless of the
|
||||
// bit ordering requested.
|
||||
//
|
||||
// Args:
|
||||
// data_ptr: A pointer to where we are at in the capture buffer.
|
||||
// nbits: Nr. of data bits we expect.
|
||||
// onemark: Nr. of uSeconds in an expected mark signal for a '1' bit.
|
||||
// onespace: Nr. of uSeconds in an expected space signal for a '1' bit.
|
||||
// zeromark: Nr. of uSeconds in an expected mark signal for a '0' bit.
|
||||
// zerospace: Nr. of uSeconds in an expected space signal for a '0' bit.
|
||||
// tolerance: Percentage error margin to allow. (Def: kTolerance)
|
||||
// excess: Nr. of useconds. (Def: kMarkExcess)
|
||||
// MSBfirst: Bit order to save the data in. (Def: true)
|
||||
// Returns:
|
||||
// A match_result_t structure containing the success (or not), the data value,
|
||||
// and how many buffer entries were used.
|
||||
match_result_t IRrecv::matchData(
|
||||
volatile uint16_t *data_ptr, const uint16_t nbits, const uint16_t onemark,
|
||||
const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace,
|
||||
const uint8_t tolerance, const int16_t excess, const bool MSBfirst) {
|
||||
match_result_t result;
|
||||
result.success = false; // Fail by default.
|
||||
result.data = 0;
|
||||
for (result.used = 0; result.used < nbits * 2;
|
||||
result.used += 2, data_ptr += 2) {
|
||||
// Is the bit a '1'?
|
||||
if (matchMark(*data_ptr, onemark, tolerance, excess) &&
|
||||
matchSpace(*(data_ptr + 1), onespace, tolerance, excess)) {
|
||||
result.data = (result.data << 1) | 1;
|
||||
} else if (matchMark(*data_ptr, zeromark, tolerance, excess) &&
|
||||
matchSpace(*(data_ptr + 1), zerospace, tolerance, excess)) {
|
||||
result.data <<= 1; // The bit is a '0'.
|
||||
} else {
|
||||
if (!MSBfirst) result.data = reverseBits(result.data, result.used / 2);
|
||||
return result; // It's neither, so fail.
|
||||
}
|
||||
}
|
||||
result.success = true;
|
||||
if (!MSBfirst) result.data = reverseBits(result.data, nbits);
|
||||
return result;
|
||||
}
|
||||
|
||||
// End of IRrecv class -------------------
|
||||
@@ -0,0 +1,335 @@
|
||||
// Copyright 2009 Ken Shirriff
|
||||
// Copyright 2015 Mark Szabo
|
||||
// Copyright 2015 Sebastien Warin
|
||||
// Copyright 2017 David Conran
|
||||
|
||||
#ifndef IRRECV_H_
|
||||
#define IRRECV_H_
|
||||
|
||||
#ifndef UNIT_TEST
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
#include <stddef.h>
|
||||
#define __STDC_LIMIT_MACROS
|
||||
#include <stdint.h>
|
||||
#include "IRremoteESP8266.h"
|
||||
|
||||
// Constants
|
||||
const uint16_t kHeader = 2; // Usual nr. of header entries.
|
||||
const uint16_t kFooter = 2; // Usual nr. of footer (stop bits) entries.
|
||||
const uint16_t kStartOffset = 1; // Usual rawbuf entry to start from.
|
||||
#define MS_TO_USEC(x) (x * 1000U) // Convert milli-Seconds to micro-Seconds.
|
||||
// Marks tend to be 100us too long, and spaces 100us too short
|
||||
// when received due to sensor lag.
|
||||
const uint16_t kMarkExcess = 50;
|
||||
const uint16_t kRawBuf = 100; // Default length of raw capture buffer
|
||||
const uint64_t kRepeat = UINT64_MAX;
|
||||
// Default min size of reported UNKNOWN messages.
|
||||
const uint16_t kUnknownThreshold = 6;
|
||||
|
||||
// receiver states
|
||||
const uint8_t kIdleState = 2;
|
||||
const uint8_t kMarkState = 3;
|
||||
const uint8_t kSpaceState = 4;
|
||||
const uint8_t kStopState = 5;
|
||||
const uint8_t kTolerance = 25; // default percent tolerance in measurements.
|
||||
const uint16_t kRawTick = 2; // Capture tick to uSec factor.
|
||||
#define RAWTICK kRawTick // Deprecated. For legacy user code support only.
|
||||
// How long (ms) before we give up wait for more data?
|
||||
// Don't exceed kMaxTimeoutMs without a good reason.
|
||||
// That is the capture buffers maximum value size. (UINT16_MAX / kRawTick)
|
||||
// Typically messages/protocols tend to repeat around the 100ms timeframe,
|
||||
// thus we should timeout before that to give us some time to try to decode
|
||||
// before we need to start capturing a possible new message.
|
||||
// Typically 15ms suits most applications. However, some protocols demand a
|
||||
// higher value. e.g. 90ms for XMP-1 and some aircon units.
|
||||
const uint8_t kTimeoutMs = 15; // In MilliSeconds.
|
||||
#define TIMEOUT_MS kTimeoutMs // For legacy documentation.
|
||||
const uint16_t kMaxTimeoutMs = kRawTick * (UINT16_MAX / MS_TO_USEC(1));
|
||||
|
||||
// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
|
||||
const uint32_t kFnvPrime32 = 16777619UL;
|
||||
const uint32_t kFnvBasis32 = 2166136261UL;
|
||||
|
||||
#if DECODE_AC
|
||||
// Hitachi AC is the current largest state size.
|
||||
const uint16_t kStateSizeMax = kHitachiAc2StateLength;
|
||||
#else
|
||||
// Just define something
|
||||
const uint16_t kStateSizeMax = 0;
|
||||
#endif
|
||||
|
||||
// Types
|
||||
// information for the interrupt handler
|
||||
typedef struct {
|
||||
uint8_t recvpin; // pin for IR data from detector
|
||||
uint8_t rcvstate; // state machine
|
||||
uint16_t timer; // state timer, counts 50uS ticks.
|
||||
uint16_t bufsize; // max. nr. of entries in the capture buffer.
|
||||
uint16_t *rawbuf; // raw data
|
||||
// uint16_t is used for rawlen as it saves 3 bytes of iram in the interrupt
|
||||
// handler. Don't ask why, I don't know. It just does.
|
||||
uint16_t rawlen; // counter of entries in rawbuf.
|
||||
uint8_t overflow; // Buffer overflow indicator.
|
||||
uint8_t timeout; // Nr. of milliSeconds before we give up.
|
||||
} irparams_t;
|
||||
|
||||
// results from a data match
|
||||
typedef struct {
|
||||
bool success; // Was the match successful?
|
||||
uint64_t data; // The data found.
|
||||
uint16_t used; // How many buffer positions were used.
|
||||
} match_result_t;
|
||||
|
||||
// Classes
|
||||
|
||||
// Results returned from the decoder
|
||||
class decode_results {
|
||||
public:
|
||||
decode_type_t decode_type; // NEC, SONY, RC5, UNKNOWN
|
||||
// value, address, & command are all mutually exclusive with state.
|
||||
// i.e. They MUST NOT be used at the same time as state, so we can use a union
|
||||
// structure to save us a handful of valuable bytes of memory.
|
||||
union {
|
||||
struct {
|
||||
uint64_t value; // Decoded value
|
||||
uint32_t address; // Decoded device address.
|
||||
uint32_t command; // Decoded command.
|
||||
};
|
||||
uint8_t state[kStateSizeMax]; // Multi-byte results.
|
||||
};
|
||||
uint16_t bits; // Number of bits in decoded value
|
||||
volatile uint16_t *rawbuf; // Raw intervals in .5 us ticks
|
||||
uint16_t rawlen; // Number of records in rawbuf.
|
||||
bool overflow;
|
||||
bool repeat; // Is the result a repeat code?
|
||||
};
|
||||
|
||||
// main class for receiving IR
|
||||
class IRrecv {
|
||||
public:
|
||||
explicit IRrecv(uint16_t recvpin, uint16_t bufsize = kRawBuf,
|
||||
uint8_t timeout = kTimeoutMs,
|
||||
bool save_buffer = false); // Constructor
|
||||
~IRrecv(); // Destructor
|
||||
bool decode(decode_results *results, irparams_t *save = NULL);
|
||||
void enableIRIn();
|
||||
void disableIRIn();
|
||||
void resume();
|
||||
uint16_t getBufSize();
|
||||
#if DECODE_HASH
|
||||
void setUnknownThreshold(uint16_t length);
|
||||
#endif
|
||||
static bool match(uint32_t measured, uint32_t desired,
|
||||
uint8_t tolerance = kTolerance, uint16_t delta = 0);
|
||||
static bool matchMark(uint32_t measured, uint32_t desired,
|
||||
uint8_t tolerance = kTolerance,
|
||||
int16_t excess = kMarkExcess);
|
||||
static bool matchSpace(uint32_t measured, uint32_t desired,
|
||||
uint8_t tolerance = kTolerance,
|
||||
int16_t excess = kMarkExcess);
|
||||
#ifndef UNIT_TEST
|
||||
|
||||
private:
|
||||
#endif
|
||||
irparams_t *irparams_save;
|
||||
#if DECODE_HASH
|
||||
uint16_t unknown_threshold;
|
||||
#endif
|
||||
// These are called by decode
|
||||
void copyIrParams(volatile irparams_t *src, irparams_t *dst);
|
||||
int16_t compare(uint16_t oldval, uint16_t newval);
|
||||
static uint32_t ticksLow(uint32_t usecs, uint8_t tolerance = kTolerance,
|
||||
uint16_t delta = 0);
|
||||
static uint32_t ticksHigh(uint32_t usecs, uint8_t tolerance = kTolerance,
|
||||
uint16_t delta = 0);
|
||||
bool matchAtLeast(uint32_t measured, uint32_t desired,
|
||||
uint8_t tolerance = kTolerance, uint16_t delta = 0);
|
||||
match_result_t matchData(volatile uint16_t *data_ptr, const uint16_t nbits,
|
||||
const uint16_t onemark, const uint32_t onespace,
|
||||
const uint16_t zeromark, const uint32_t zerospace,
|
||||
const uint8_t tolerance = kTolerance,
|
||||
const int16_t excess = kMarkExcess,
|
||||
const bool MSBfirst = true);
|
||||
bool decodeHash(decode_results *results);
|
||||
#if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || SEND_SANYO)
|
||||
bool decodeNEC(decode_results *results, uint16_t nbits = kNECBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_SONY
|
||||
bool decodeSony(decode_results *results, uint16_t nbits = kSonyMinBits,
|
||||
bool strict = false);
|
||||
#endif
|
||||
#if DECODE_SANYO
|
||||
// DISABLED due to poor quality.
|
||||
// bool decodeSanyo(decode_results *results,
|
||||
// uint16_t nbits = kSanyoSA8650BBits,
|
||||
// bool strict = false);
|
||||
bool decodeSanyoLC7461(decode_results *results,
|
||||
uint16_t nbits = kSanyoLC7461Bits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_MITSUBISHI
|
||||
bool decodeMitsubishi(decode_results *results,
|
||||
uint16_t nbits = kMitsubishiBits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_MITSUBISHI2
|
||||
bool decodeMitsubishi2(decode_results *results,
|
||||
uint16_t nbits = kMitsubishiBits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_MITSUBISHI_AC
|
||||
bool decodeMitsubishiAC(decode_results *results,
|
||||
uint16_t nbits = kMitsubishiACBits,
|
||||
bool strict = false);
|
||||
#endif
|
||||
#if (DECODE_RC5 || DECODE_R6 || DECODE_LASERTAG || DECODE_MWM)
|
||||
int16_t getRClevel(decode_results *results, uint16_t *offset, uint16_t *used,
|
||||
uint16_t bitTime, uint8_t tolerance = kTolerance,
|
||||
int16_t excess = kMarkExcess, uint16_t delta = 0,
|
||||
uint8_t maxwidth = 3);
|
||||
#endif
|
||||
#if DECODE_RC5
|
||||
bool decodeRC5(decode_results *results, uint16_t nbits = kRC5XBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_RC6
|
||||
bool decodeRC6(decode_results *results, uint16_t nbits = kRC6Mode0Bits,
|
||||
bool strict = false);
|
||||
#endif
|
||||
#if DECODE_RCMM
|
||||
bool decodeRCMM(decode_results *results, uint16_t nbits = kRCMMBits,
|
||||
bool strict = false);
|
||||
#endif
|
||||
#if (DECODE_PANASONIC || DECODE_DENON)
|
||||
bool decodePanasonic(decode_results *results, uint16_t nbits = kPanasonicBits,
|
||||
bool strict = false,
|
||||
uint32_t manufacturer = kPanasonicManufacturer);
|
||||
#endif
|
||||
#if DECODE_LG
|
||||
bool decodeLG(decode_results *results, uint16_t nbits = kLgBits,
|
||||
bool strict = false);
|
||||
#endif
|
||||
#if DECODE_JVC
|
||||
bool decodeJVC(decode_results *results, uint16_t nbits = kJvcBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_SAMSUNG
|
||||
bool decodeSAMSUNG(decode_results *results, uint16_t nbits = kSamsungBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_SAMSUNG_AC
|
||||
bool decodeSamsungAC(decode_results *results, uint16_t nbits = kSamsungAcBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_WHYNTER
|
||||
bool decodeWhynter(decode_results *results, uint16_t nbits = kWhynterBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_COOLIX
|
||||
bool decodeCOOLIX(decode_results *results, uint16_t nbits = kCoolixBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_DENON
|
||||
bool decodeDenon(decode_results *results, uint16_t nbits = DENON_BITS,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_DISH
|
||||
bool decodeDISH(decode_results *results, uint16_t nbits = kDishBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if (DECODE_SHARP || DECODE_DENON)
|
||||
bool decodeSharp(decode_results *results, uint16_t nbits = kSharpBits,
|
||||
bool strict = true, bool expansion = true);
|
||||
#endif
|
||||
#if DECODE_AIWA_RC_T501
|
||||
bool decodeAiwaRCT501(decode_results *results,
|
||||
uint16_t nbits = kAiwaRcT501Bits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_NIKAI
|
||||
bool decodeNikai(decode_results *results, uint16_t nbits = kNikaiBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_MAGIQUEST
|
||||
bool decodeMagiQuest(decode_results *results, uint16_t nbits = kMagiquestBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_KELVINATOR
|
||||
bool decodeKelvinator(decode_results *results,
|
||||
uint16_t nbits = kKelvinatorBits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_DAIKIN
|
||||
bool decodeDaikin(decode_results *results, uint16_t nbits = kDaikinRawBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_TOSHIBA_AC
|
||||
bool decodeToshibaAC(decode_results *results,
|
||||
uint16_t nbytes = kToshibaACBits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_MIDEA
|
||||
bool decodeMidea(decode_results *results, uint16_t nbits = kMideaBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_FUJITSU_AC
|
||||
bool decodeFujitsuAC(decode_results *results, uint16_t nbits = kFujitsuAcBits,
|
||||
bool strict = false);
|
||||
#endif
|
||||
#if DECODE_LASERTAG
|
||||
bool decodeLasertag(decode_results *results, uint16_t nbits = kLasertagBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_CARRIER_AC
|
||||
bool decodeCarrierAC(decode_results *results, uint16_t nbits = kCarrierAcBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_GREE
|
||||
bool decodeGree(decode_results *results, uint16_t nbits = kGreeBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02)
|
||||
bool decodeHaierAC(decode_results *results, uint16_t nbits = kHaierACBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_HAIER_AC_YRW02
|
||||
bool decodeHaierACYRW02(decode_results *results,
|
||||
uint16_t nbits = kHaierACYRW02Bits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2)
|
||||
bool decodeHitachiAC(decode_results *results, uint16_t nbits = kHitachiAcBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_HITACHI_AC1
|
||||
bool decodeHitachiAC1(decode_results *results,
|
||||
uint16_t nbits = kHitachiAc1Bits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_GICABLE
|
||||
bool decodeGICable(decode_results *results, uint16_t nbits = kGicableBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_WHIRLPOOL_AC
|
||||
bool decodeWhirlpoolAC(decode_results *results,
|
||||
uint16_t nbits = kWhirlpoolAcBits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_LUTRON
|
||||
bool decodeLutron(decode_results *results, uint16_t nbits = kLutronBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_ELECTRA_AC
|
||||
bool decodeElectraAC(decode_results *results, uint16_t nbits = kElectraAcBits,
|
||||
bool strict = true);
|
||||
#endif
|
||||
#if DECODE_PANASONIC_AC
|
||||
bool decodePanasonicAC(decode_results *results,
|
||||
uint16_t nbits = kPanasonicAcBits, bool strict = true);
|
||||
#endif
|
||||
#if DECODE_PIONEER
|
||||
bool decodePioneer(decode_results *results,
|
||||
const uint16_t nbits = kPioneerBits,
|
||||
const bool strict = true);
|
||||
#endif
|
||||
#if DECODE_MWM
|
||||
bool decodeMWM(decode_results *results, uint16_t nbits = 24,
|
||||
bool strict = true);
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // IRRECV_H_
|
||||
@@ -0,0 +1,453 @@
|
||||
/***************************************************
|
||||
* IRremote for ESP8266
|
||||
*
|
||||
* Based on the IRremote library for Arduino by Ken Shirriff
|
||||
* Version 0.11 August, 2009
|
||||
* Copyright 2009 Ken Shirriff
|
||||
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
||||
*
|
||||
* Edited by Mitra to add new controller SANYO
|
||||
*
|
||||
* Interrupt code based on NECIRrcv by Joe Knapp
|
||||
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
|
||||
* Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
|
||||
*
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
|
||||
* LG added by Darryl Smith (based on the JVC protocol)
|
||||
* Whynter A/C ARC-110WD added by Francesco Meschia
|
||||
* Coolix A/C / heatpump added by (send) bakrus & (decode) crankyoldgit
|
||||
* Denon: sendDenon, decodeDenon added by Massimiliano Pinto
|
||||
(from https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp)
|
||||
* Kelvinator A/C and Sherwood added by crankyoldgit
|
||||
* Mitsubishi (TV) sending added by crankyoldgit
|
||||
* Pronto code sending added by crankyoldgit
|
||||
* Mitsubishi & Toshiba A/C added by crankyoldgit
|
||||
* (derived from https://github.com/r45635/HVAC-IR-Control)
|
||||
* DISH decode by marcosamarinho
|
||||
* Gree Heatpump sending added by Ville Skyttä (scop)
|
||||
* (derived from https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp)
|
||||
* Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for sending IR code on ESP8266
|
||||
* Updated by Sebastien Warin (http://sebastien.warin.fr) for receiving IR code on ESP8266
|
||||
*
|
||||
* Updated by sillyfrog for Daikin, adopted from
|
||||
* (https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/)
|
||||
* Fujitsu A/C code added by jonnygraham
|
||||
* Trotec AC code by stufisher
|
||||
* Carrier & Haier AC code by crankyoldgit
|
||||
*
|
||||
* GPL license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#ifndef IRREMOTEESP8266_H_
|
||||
#define IRREMOTEESP8266_H_
|
||||
|
||||
#define __STDC_LIMIT_MACROS
|
||||
#include <stdint.h>
|
||||
#ifdef UNIT_TEST
|
||||
#include <iostream>
|
||||
#endif
|
||||
|
||||
// Library Version
|
||||
#define _IRREMOTEESP8266_VERSION_ "2.5.2"
|
||||
// Supported IR protocols
|
||||
// Each protocol you include costs memory and, during decode, costs time
|
||||
// Disable (set to false) all the protocols you do not need/want!
|
||||
// The Air Conditioner protocols are the most expensive memory-wise.
|
||||
//
|
||||
#define DECODE_HASH true // Semi-unique code for unknown messages
|
||||
|
||||
#define SEND_RAW true
|
||||
|
||||
#define DECODE_NEC true
|
||||
#define SEND_NEC true
|
||||
|
||||
#define DECODE_SHERWOOD true // Doesn't exist. Actually is DECODE_NEC
|
||||
#define SEND_SHERWOOD true
|
||||
|
||||
#define DECODE_RC5 true
|
||||
#define SEND_RC5 true
|
||||
|
||||
#define DECODE_RC6 true
|
||||
#define SEND_RC6 true
|
||||
|
||||
#define DECODE_RCMM true
|
||||
#define SEND_RCMM true
|
||||
|
||||
#define DECODE_SONY true
|
||||
#define SEND_SONY true
|
||||
|
||||
#define DECODE_PANASONIC true
|
||||
#define SEND_PANASONIC true
|
||||
|
||||
#define DECODE_JVC true
|
||||
#define SEND_JVC true
|
||||
|
||||
#define DECODE_SAMSUNG true
|
||||
#define SEND_SAMSUNG true
|
||||
|
||||
#define DECODE_SAMSUNG_AC true
|
||||
#define SEND_SAMSUNG_AC true
|
||||
|
||||
#define DECODE_WHYNTER true
|
||||
#define SEND_WHYNTER true
|
||||
|
||||
#define DECODE_AIWA_RC_T501 true
|
||||
#define SEND_AIWA_RC_T501 true
|
||||
|
||||
#define DECODE_LG true
|
||||
#define SEND_LG true
|
||||
|
||||
#define DECODE_SANYO true
|
||||
#define SEND_SANYO true
|
||||
|
||||
#define DECODE_MITSUBISHI true
|
||||
#define SEND_MITSUBISHI true
|
||||
|
||||
#define DECODE_MITSUBISHI2 true
|
||||
#define SEND_MITSUBISHI2 true
|
||||
|
||||
#define DECODE_DISH true
|
||||
#define SEND_DISH true
|
||||
|
||||
#define DECODE_SHARP true
|
||||
#define SEND_SHARP true
|
||||
|
||||
#define DECODE_DENON true
|
||||
#define SEND_DENON true
|
||||
|
||||
#define DECODE_KELVINATOR true
|
||||
#define SEND_KELVINATOR true
|
||||
|
||||
#define DECODE_MITSUBISHI_AC true // Beta.
|
||||
#define SEND_MITSUBISHI_AC true
|
||||
|
||||
#define DECODE_FUJITSU_AC true
|
||||
#define SEND_FUJITSU_AC true
|
||||
|
||||
#define DECODE_DAIKIN true
|
||||
#define SEND_DAIKIN true
|
||||
|
||||
#define DECODE_COOLIX true
|
||||
#define SEND_COOLIX true
|
||||
|
||||
#define DECODE_GLOBALCACHE false // Not written.
|
||||
#define SEND_GLOBALCACHE true
|
||||
|
||||
#define DECODE_GREE true
|
||||
#define SEND_GREE true
|
||||
|
||||
#define DECODE_PRONTO false // Not written.
|
||||
#define SEND_PRONTO true
|
||||
|
||||
#define DECODE_ARGO false // Not written.
|
||||
#define SEND_ARGO true
|
||||
|
||||
#define DECODE_TROTEC false // Not implemented.
|
||||
#define SEND_TROTEC true
|
||||
|
||||
#define DECODE_NIKAI true
|
||||
#define SEND_NIKAI true
|
||||
|
||||
#define DECODE_TOSHIBA_AC true
|
||||
#define SEND_TOSHIBA_AC true
|
||||
|
||||
#define DECODE_MAGIQUEST true
|
||||
#define SEND_MAGIQUEST true
|
||||
|
||||
#define DECODE_MIDEA true
|
||||
#define SEND_MIDEA true
|
||||
|
||||
#define DECODE_LASERTAG true
|
||||
#define SEND_LASERTAG true
|
||||
|
||||
#define DECODE_CARRIER_AC true
|
||||
#define SEND_CARRIER_AC true
|
||||
|
||||
#define DECODE_HAIER_AC true
|
||||
#define SEND_HAIER_AC true
|
||||
|
||||
#define DECODE_HITACHI_AC true
|
||||
#define SEND_HITACHI_AC true
|
||||
|
||||
#define DECODE_HITACHI_AC1 true
|
||||
#define SEND_HITACHI_AC1 true
|
||||
|
||||
#define DECODE_HITACHI_AC2 true
|
||||
#define SEND_HITACHI_AC2 true
|
||||
|
||||
#define DECODE_GICABLE true
|
||||
#define SEND_GICABLE true
|
||||
|
||||
#define DECODE_HAIER_AC_YRW02 true
|
||||
#define SEND_HAIER_AC_YRW02 true
|
||||
|
||||
#define DECODE_WHIRLPOOL_AC true
|
||||
#define SEND_WHIRLPOOL_AC true
|
||||
|
||||
#define DECODE_LUTRON true
|
||||
#define SEND_LUTRON true
|
||||
|
||||
#define DECODE_ELECTRA_AC true
|
||||
#define SEND_ELECTRA_AC true
|
||||
|
||||
#define DECODE_PANASONIC_AC true
|
||||
#define SEND_PANASONIC_AC true
|
||||
|
||||
#define DECODE_MWM true
|
||||
#define SEND_MWM true
|
||||
|
||||
#define DECODE_PIONEER true
|
||||
#define SEND_PIONEER true
|
||||
|
||||
#if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \
|
||||
DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \
|
||||
DECODE_TROTEC || DECODE_HAIER_AC || DECODE_HITACHI_AC || \
|
||||
DECODE_HITACHI_AC1 || DECODE_HITACHI_AC2 || DECODE_HAIER_AC_YRW02 || \
|
||||
DECODE_WHIRLPOOL_AC || DECODE_SAMSUNG_AC || DECODE_ELECTRA_AC || \
|
||||
DECODE_PANASONIC_AC || DECODE_MWM)
|
||||
#define DECODE_AC true // We need some common infrastructure for decoding A/Cs.
|
||||
#else
|
||||
#define DECODE_AC false // We don't need that infrastructure.
|
||||
#endif
|
||||
|
||||
// Use millisecond 'delay()' calls where we can to avoid tripping the WDT.
|
||||
// Note: If you plan to send IR messages in the callbacks of the AsyncWebserver
|
||||
// library, you need to set ALLOW_DELAY_CALLS to false.
|
||||
// Ref: https://github.com/markszabo/IRremoteESP8266/issues/430
|
||||
#define ALLOW_DELAY_CALLS true
|
||||
|
||||
/*
|
||||
* Always add to the end of the list and should never remove entries
|
||||
* or change order. Projects may save the type number for later usage
|
||||
* so numbering should always stay the same.
|
||||
*/
|
||||
enum decode_type_t {
|
||||
UNKNOWN = -1,
|
||||
UNUSED = 0,
|
||||
RC5,
|
||||
RC6,
|
||||
NEC,
|
||||
SONY,
|
||||
PANASONIC,
|
||||
JVC,
|
||||
SAMSUNG,
|
||||
WHYNTER,
|
||||
AIWA_RC_T501,
|
||||
LG,
|
||||
SANYO,
|
||||
MITSUBISHI,
|
||||
DISH,
|
||||
SHARP,
|
||||
COOLIX,
|
||||
DAIKIN,
|
||||
DENON,
|
||||
KELVINATOR,
|
||||
SHERWOOD,
|
||||
MITSUBISHI_AC,
|
||||
RCMM,
|
||||
SANYO_LC7461,
|
||||
RC5X,
|
||||
GREE,
|
||||
PRONTO, // Technically not a protocol, but an encoding.
|
||||
NEC_LIKE,
|
||||
ARGO,
|
||||
TROTEC,
|
||||
NIKAI,
|
||||
RAW, // Technically not a protocol, but an encoding.
|
||||
GLOBALCACHE, // Technically not a protocol, but an encoding.
|
||||
TOSHIBA_AC,
|
||||
FUJITSU_AC,
|
||||
MIDEA,
|
||||
MAGIQUEST,
|
||||
LASERTAG,
|
||||
CARRIER_AC,
|
||||
HAIER_AC,
|
||||
MITSUBISHI2,
|
||||
HITACHI_AC,
|
||||
HITACHI_AC1,
|
||||
HITACHI_AC2,
|
||||
GICABLE,
|
||||
HAIER_AC_YRW02,
|
||||
WHIRLPOOL_AC,
|
||||
SAMSUNG_AC,
|
||||
LUTRON,
|
||||
ELECTRA_AC,
|
||||
PANASONIC_AC,
|
||||
PIONEER,
|
||||
LG2,
|
||||
MWM,
|
||||
};
|
||||
|
||||
// Message lengths & required repeat values
|
||||
const uint16_t kNoRepeat = 0;
|
||||
const uint16_t kSingleRepeat = 1;
|
||||
|
||||
const uint16_t kAiwaRcT501Bits = 15;
|
||||
const uint16_t kAiwaRcT501MinRepeats = kSingleRepeat;
|
||||
const uint16_t kArgoStateLength = 12;
|
||||
const uint16_t kCoolixBits = 24;
|
||||
const uint16_t kCarrierAcBits = 32;
|
||||
const uint16_t kCarrierAcMinRepeat = kNoRepeat;
|
||||
// Daikin has a lot of static stuff that is discarded
|
||||
const uint16_t kDaikinRawBits = 583;
|
||||
const uint16_t kDaikinStateLength = 27;
|
||||
const uint16_t kDaikinBits = kDaikinStateLength * 8;
|
||||
const uint16_t kDenonBits = 15;
|
||||
const uint16_t kDenonLegacyBits = 14;
|
||||
const uint16_t kDishBits = 16;
|
||||
const uint16_t kDishMinRepeat = 3;
|
||||
const uint16_t kElectraAcStateLength = 13;
|
||||
const uint16_t kElectraAcBits = kElectraAcStateLength * 8;
|
||||
const uint16_t kFujitsuAcMinRepeat = kNoRepeat;
|
||||
const uint16_t kFujitsuAcStateLength = 16;
|
||||
const uint16_t kFujitsuAcStateLengthShort = 7;
|
||||
const uint16_t kFujitsuAcBits = kFujitsuAcStateLength * 8;
|
||||
const uint16_t kFujitsuAcMinBits = (kFujitsuAcStateLengthShort - 1) * 8;
|
||||
const uint16_t kGicableBits = 16;
|
||||
const uint16_t kGicableMinRepeat = kSingleRepeat;
|
||||
const uint16_t kGreeStateLength = 8;
|
||||
const uint16_t kGreeBits = kGreeStateLength * 8;
|
||||
const uint16_t kHaierACStateLength = 9;
|
||||
const uint16_t kHaierACBits = kHaierACStateLength * 8;
|
||||
const uint16_t kHaierACYRW02StateLength = 14;
|
||||
const uint16_t kHaierACYRW02Bits = kHaierACYRW02StateLength * 8;
|
||||
const uint16_t kHitachiAcStateLength = 28;
|
||||
const uint16_t kHitachiAcBits = kHitachiAcStateLength * 8;
|
||||
const uint16_t kHitachiAc1StateLength = 13;
|
||||
const uint16_t kHitachiAc1Bits = kHitachiAc1StateLength * 8;
|
||||
const uint16_t kHitachiAc2StateLength = 53;
|
||||
const uint16_t kHitachiAc2Bits = kHitachiAc2StateLength * 8;
|
||||
const uint16_t kJvcBits = 16;
|
||||
const uint16_t kKelvinatorStateLength = 16;
|
||||
const uint16_t kKelvinatorBits = kKelvinatorStateLength * 8;
|
||||
const uint16_t kLasertagBits = 13;
|
||||
const uint16_t kLasertagMinRepeat = kNoRepeat;
|
||||
const uint16_t kLgBits = 28;
|
||||
const uint16_t kLg32Bits = 32;
|
||||
const uint16_t kLutronBits = 35;
|
||||
const uint16_t kMagiquestBits = 56;
|
||||
const uint16_t kMideaBits = 48;
|
||||
const uint16_t kMideaMinRepeat = kNoRepeat;
|
||||
const uint16_t kMitsubishiBits = 16;
|
||||
// TODO(anyone): Verify that the Mitsubishi repeat is really needed.
|
||||
// Based on marcosamarinho's code.
|
||||
const uint16_t kMitsubishiMinRepeat = kSingleRepeat;
|
||||
const uint16_t kMitsubishiACStateLength = 18;
|
||||
const uint16_t kMitsubishiACBits = kMitsubishiACStateLength * 8;
|
||||
const uint16_t kMitsubishiACMinRepeat = kSingleRepeat;
|
||||
const uint16_t kNikaiBits = 24;
|
||||
const uint16_t kNECBits = 32;
|
||||
const uint16_t kPanasonicBits = 48;
|
||||
const uint32_t kPanasonicManufacturer = 0x4004;
|
||||
const uint16_t kPanasonicAcStateLength = 27;
|
||||
const uint16_t kPanasonicAcStateShortLength = 16;
|
||||
const uint16_t kPanasonicAcBits = kPanasonicAcStateLength * 8;
|
||||
const uint16_t kPanasonicAcShortBits = kPanasonicAcStateShortLength * 8;
|
||||
const uint16_t kPioneerBits = 64;
|
||||
const uint16_t kProntoMinLength = 6;
|
||||
const uint16_t kRC5RawBits = 14;
|
||||
const uint16_t kRC5Bits = kRC5RawBits - 2;
|
||||
const uint16_t kRC5XBits = kRC5RawBits - 1;
|
||||
const uint16_t kRC6Mode0Bits = 20; // Excludes the 'start' bit.
|
||||
const uint16_t kRC6_36Bits = 36; // Excludes the 'start' bit.
|
||||
const uint16_t kRCMMBits = 24;
|
||||
const uint16_t kSamsungBits = 32;
|
||||
const uint16_t kSamsungAcStateLength = 14;
|
||||
const uint16_t kSamsungAcBits = kSamsungAcStateLength * 8;
|
||||
const uint16_t kSamsungAcExtendedStateLength = 21;
|
||||
const uint16_t kSamsungAcExtendedBits = kSamsungAcExtendedStateLength * 8;
|
||||
const uint16_t kSanyoSA8650BBits = 12;
|
||||
const uint16_t kSanyoLC7461AddressBits = 13;
|
||||
const uint16_t kSanyoLC7461CommandBits = 8;
|
||||
const uint16_t kSanyoLC7461Bits = (kSanyoLC7461AddressBits +
|
||||
kSanyoLC7461CommandBits) * 2;
|
||||
const uint8_t kSharpAddressBits = 5;
|
||||
const uint8_t kSharpCommandBits = 8;
|
||||
const uint16_t kSharpBits = kSharpAddressBits + kSharpCommandBits + 2; // 15
|
||||
const uint8_t kSherwoodBits = kNECBits;
|
||||
const uint16_t kSherwoodMinRepeat = kSingleRepeat;
|
||||
const uint16_t kSony12Bits = 12;
|
||||
const uint16_t kSony15Bits = 15;
|
||||
const uint16_t kSony20Bits = 20;
|
||||
const uint16_t kSonyMinBits = 12;
|
||||
const uint16_t kSonyMinRepeat = 2;
|
||||
const uint16_t kToshibaACStateLength = 9;
|
||||
const uint16_t kToshibaACBits = kToshibaACStateLength * 8;
|
||||
const uint16_t kToshibaACMinRepeat = kSingleRepeat;
|
||||
const uint16_t kTrotecStateLength = 9;
|
||||
const uint16_t kWhirlpoolAcStateLength = 21;
|
||||
const uint16_t kWhirlpoolAcBits = kWhirlpoolAcStateLength * 8;
|
||||
const uint16_t kWhynterBits = 32;
|
||||
|
||||
// Legacy defines. (Deprecated)
|
||||
#define AIWA_RC_T501_BITS kAiwaRcT501Bits
|
||||
#define ARGO_COMMAND_LENGTH kArgoStateLength
|
||||
#define COOLIX_BITS kCoolixBits
|
||||
#define CARRIER_AC_BITS kCarrierAcBits
|
||||
#define DAIKIN_COMMAND_LENGTH kDaikinStateLength
|
||||
#define DENON_BITS kDenonBits
|
||||
#define DENON_48_BITS kPanasonicBits
|
||||
#define DENON_LEGACY_BITS kDenonLegacyBits
|
||||
#define DISH_BITS kDishBits
|
||||
#define FUJITSU_AC_MIN_REPEAT kFujitsuAcMinRepeat
|
||||
#define FUJITSU_AC_STATE_LENGTH kFujitsuAcStateLength
|
||||
#define FUJITSU_AC_STATE_LENGTH_SHORT kFujitsuAcStateLengthShort
|
||||
#define FUJITSU_AC_BITS kFujitsuAcBits
|
||||
#define FUJITSU_AC_MIN_BITS kFujitsuAcMinBits
|
||||
#define GICABLE_BITS kGicableBits
|
||||
#define GREE_STATE_LENGTH kGreeStateLength
|
||||
#define HAIER_AC_STATE_LENGTH kHaierACStateLength
|
||||
#define HAIER_AC_YRW02_STATE_LENGTH kHaierACYRW02StateLength
|
||||
#define HITACHI_AC_STATE_LENGTH kHitachiAcStateLength
|
||||
#define HITACHI_AC_BITS kHitachiAcBits
|
||||
#define HITACHI_AC1_STATE_LENGTH kHitachiAc1StateLength
|
||||
#define HITACHI_AC1_BITS kHitachiAc1Bits
|
||||
#define HITACHI_AC2_STATE_LENGTH kHitachiAc2StateLength
|
||||
#define HITACHI_AC2_BITS kHitachiAc2Bits
|
||||
#define JVC_BITS kJvcBits
|
||||
#define KELVINATOR_STATE_LENGTH kKelvinatorStateLength
|
||||
#define LASERTAG_BITS kLasertagBits
|
||||
#define LG_BITS kLgBits
|
||||
#define LG32_BITS kLg32Bits
|
||||
#define MAGIQUEST_BITS kMagiquestBits
|
||||
#define MIDEA_BITS kMideaBits
|
||||
#define MITSUBISHI_BITS kMitsubishiBits
|
||||
#define MITSUBISHI_AC_STATE_LENGTH kMitsubishiACStateLength
|
||||
#define NEC_BITS kNECBits
|
||||
#define NIKAI_BITS kNikaiBits
|
||||
#define PANASONIC_BITS kPanasonicBits
|
||||
#define RC5_BITS kRC5Bits
|
||||
#define RC5X_BITS kRC5XBits
|
||||
#define RC6_MODE0_BITS kRC6Mode0Bits
|
||||
#define RC6_36_BITS kRC6_36Bits
|
||||
#define RCMM_BITS kRCMMBits
|
||||
#define SANYO_LC7461_BITS kSanyoLC7461Bits
|
||||
#define SAMSUNG_BITS kSamsungBits
|
||||
#define SANYO_SA8650B_BITS kSanyoSA8650BBits
|
||||
#define SHARP_BITS kSharpBits
|
||||
#define SHERWOOD_BITS kSherwoodBits
|
||||
#define SONY_12_BITS kSony12Bits
|
||||
#define SONY_15_BITS kSony15Bits
|
||||
#define SONY_20_BITS kSony20Bits
|
||||
#define TOSHIBA_AC_STATE_LENGTH kToshibaACStateLength
|
||||
#define TROTEC_COMMAND_LENGTH kTrotecStateLength
|
||||
#define WHYNTER_BITS kWhynterBits
|
||||
|
||||
// Turn on Debugging information by uncommenting the following line.
|
||||
// #define DEBUG 1
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef UNIT_TEST
|
||||
#define DPRINT(x) do { std::cout << x; } while (0)
|
||||
#define DPRINTLN(x) do { std::cout << x << std::endl; } while (0)
|
||||
#endif // UNIT_TEST
|
||||
#ifdef ARDUINO
|
||||
#define DPRINT(x) do { Serial.print(x); } while (0)
|
||||
#define DPRINTLN(x) do { Serial.println(x); } while (0)
|
||||
#endif // ARDUINO
|
||||
#else // DEBUG
|
||||
#define DPRINT(x)
|
||||
#define DPRINTLN(x)
|
||||
#endif // DEBUG
|
||||
|
||||
#endif // IRREMOTEESP8266_H_
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user