Advertisement
Guest User

Untitled

a guest
Jun 5th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.61 KB | None | 0 0
  1. #include <IRremoteESP8266.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <stdlib.h>
  6. #include <ESP8266WiFi.h>
  7. #include <PubSubClient.h>
  8. #define DEBUG 1
  9. const char* ssid = "";
  10. const char* password = "";
  11. const char* mqtt_server = "m11.cloudmqtt.com";
  12. const char* mqtt_user = "";
  13. const char* mqtt_password = "";
  14.  
  15. WiFiClient espClient;
  16. PubSubClient client(espClient);
  17.  
  18. IRsend irsend(2);
  19.  
  20. unsigned rawmessage[139];
  21. char mode[10] = "Cool";
  22. char state[10] = "Off";
  23. int speed = 0;
  24. char swing[10] = "Off";
  25. int sleep = 0;
  26. int temp = 21;
  27.  
  28.  
  29. void binaryAddLimit(char* out, char first[], char plus[], int binsize) {
  30. char result[binsize+1];
  31.  
  32. int carrier = 0;
  33. int i;
  34. for (i = 0; i < binsize; ++i) {
  35. if (first[i] == '0' && plus[i] == '0' && carrier == 0) {
  36. result[i] = '0';
  37. carrier = 0;
  38. } else if (first[i] == '1' && plus[i] == '0' && carrier == 0) {
  39. result[i] = '1';
  40. carrier = 0;
  41. } else if (first[i] == '0' && plus[i] == '1' && carrier == 0) {
  42. result[i] = '1';
  43. carrier = 0;
  44. } else if (first[i] == '1' && plus[i] == '1' && carrier == 0) {
  45. result[i] = '0';
  46. carrier = 1;
  47. } else if (first[i] == '0' && plus[i] == '0' && carrier == 1) {
  48. result[i] = '1';
  49. carrier = 0;
  50. } else if (first[i] == '1' && plus[i] == '0' && carrier == 1) {
  51. result[i] = '0';
  52. carrier = 1;
  53. } else if (first[i] == '0' && plus[i] == '1' && carrier == 1) {
  54. result[i] = '0';
  55. carrier = 1;
  56. } else if (first[i] == '1' && plus[i] == '1' && carrier == 1) {
  57. result[i] = '1';
  58. carrier = 1;
  59. }
  60. }
  61. result[binsize] = '\0';
  62. i = 0;
  63. char tmp;
  64. while (carrier == 1 && i < binsize) {
  65. if (result[i] == '0') {
  66. tmp = '1';
  67. carrier = 0;
  68. }
  69. else if (result[i] == '1') {
  70. tmp = '0';
  71. }
  72. result[i] = tmp;
  73. i += 1;
  74. }
  75. strcpy(out, result);
  76. }
  77.  
  78. void getBinState(char* out, char state[]) {
  79. if (strcmp(state,"Off")==0) {
  80. strcpy(out, "0");
  81. } else if (strcmp(state,"On")==0) {
  82. strcpy(out, "1");
  83. } else {
  84. strcpy(out, "Erro");
  85. }
  86. }
  87. void getBinMode(char* out, char mode[]) {
  88. if (strcmp(mode,"Auto")==0) {
  89. strcpy(out, "000");
  90. } else if (strcmp(mode,"Cool")==0) {
  91. strcpy(out, "100");
  92. } else if (strcmp(mode,"Dry")==0) {
  93. strcpy(out, "010");
  94. } else if (strcmp(mode,"Fan")==0) {
  95. strcpy(out, "110");
  96. } else if (strcmp(mode,"Heat")==0) {
  97. strcpy(out, "001");
  98. } else {
  99. strcpy(out, "Erro");
  100. }
  101. }
  102. void getBinSpeed1(char* out, int speed) {
  103. char* speeds[] = {"00", "10", "01", "11", "11"};
  104. if (0 <= speed && speed <= 4)
  105. strcpy(out, speeds[speed]);
  106. else
  107. strcpy(out, "E");
  108. }
  109. void getBinSpeed2(char* out, int speed) {
  110. char* speeds[] = {"0", "0", "0", "0", "1"};
  111. if (0 <= speed && speed <= 4)
  112. strcpy(out, speeds[speed]);
  113. else
  114. strcpy(out, "E");
  115. }
  116. void getBinSwing1(char* out, char swing[]) {
  117. if (strcmp(swing,"On")==0) {
  118. strcpy(out, "1");
  119. } else {
  120. strcpy(out, "0");
  121. }
  122. }
  123. void getBinSwing2(char* out, char swing[]) {
  124. if (strcmp(swing,"On")==0) {
  125. strcpy(out, "00110");
  126. } else {
  127. strcpy(out, "00000");
  128. }
  129. }
  130. void getBinSleep(char* out, int sleep) {
  131. if (sleep) {
  132. strcpy(out, "1");
  133. } else {
  134. strcpy(out, "0");
  135. }
  136. }
  137. void getBinTemp(char* out, int temp) {
  138. switch ( temp ) {
  139. case 16:
  140. strcpy(out, "0000");
  141. break;
  142. case 17:
  143. strcpy(out, "1000");
  144. break;
  145. case 18:
  146. strcpy(out, "0100");
  147. break;
  148. case 19:
  149. strcpy(out, "1100");
  150. break;
  151. case 20:
  152. strcpy(out, "0010");
  153. break;
  154. case 21:
  155. strcpy(out, "1010");
  156. break;
  157. case 22:
  158. strcpy(out, "0110");
  159. break;
  160. case 23:
  161. strcpy(out, "1110");
  162. break;
  163. case 24:
  164. strcpy(out, "0001");
  165. break;
  166. case 25:
  167. strcpy(out, "1001");
  168. break;
  169. case 26:
  170. strcpy(out, "0101");
  171. break;
  172. case 27:
  173. strcpy(out, "1101");
  174. break;
  175. case 28:
  176. strcpy(out, "0011");
  177. break;
  178. case 29:
  179. strcpy(out, "1011");
  180. break;
  181. case 30:
  182. strcpy(out, "0111");
  183. break;
  184. default:
  185. strcpy(out, "Error");
  186. break;
  187. }
  188. }
  189. void getBinChecksum(char* out, char bintemp[], char swing[], char state[], char mode[]) {
  190. char result[10];
  191. char plus[10];
  192.  
  193. if (strcmp(mode,"Auto")==0) {
  194. strcpy(plus, "0010");
  195. } else if (strcmp(mode,"Cool")==0) {
  196. strcpy(plus, "1010");
  197. } else if (strcmp(mode,"Dry")==0) {
  198. strcpy(plus, "0110");
  199. } else if (strcmp(mode,"Fan")==0) {
  200. strcpy(plus, "1110");
  201. } else if (strcmp(mode,"Heat")==0) {
  202. strcpy(plus, "0001");
  203. }
  204. binaryAddLimit(result, bintemp, plus, 4);
  205.  
  206. if (strcmp(mode,"On")==0) {
  207. strcpy(plus, "1000");
  208. } else {
  209. strcpy(plus, "0000");
  210. }
  211. binaryAddLimit(result, result, plus, 4);
  212.  
  213. if (strcmp(state,"Off")==0) {
  214. strcpy(plus, "0001");
  215. } else if (strcmp(state,"On")==0) {
  216. strcpy(plus, "0000");
  217. }
  218. binaryAddLimit(result, result, plus, 4);
  219.  
  220. if (DEBUG >= 3){
  221. printf("\n checksumprint \n");
  222. for (int i = 0; i < 4; ++i) {
  223. printf("bit: %c\n", result[i]);
  224. }
  225. printf("\n temp \n");
  226. for (int i = 0; i < 4; ++i) {
  227. printf("%c", bintemp[i]);
  228. }
  229. printf("\n \n");
  230. }
  231.  
  232. strcpy(out, result);
  233. }
  234. void getBinSame1(char* out) {
  235. strcpy(out, "00000000");
  236. }
  237. void getBinSame2(char* out) {
  238. strcpy(out, "110000010100102");
  239. }
  240. void getBinSame3(char* out) {
  241. strcpy(out, "00000000100000000000000");
  242. }
  243. void getBinCommand(char* out, char state[], char mode[], int speed, char swing[], int sleep, int temp) {
  244. char binState[10];
  245. char binMode[10];
  246. char binSpeed1[10];
  247. char binSpeed2[10];
  248. char binSwing1[10];
  249. char binSwing2[10];
  250. char binSleep[10];
  251. char binTemp[10];
  252. char binChecksum[10];
  253. char binSame1[20];
  254. char binSame2[20];
  255. char binSame3[30];
  256.  
  257. getBinState(binState, state);
  258. getBinMode(binMode, mode);
  259. getBinSpeed1(binSpeed1, speed);
  260. getBinSpeed2(binSpeed2, speed);
  261. getBinSwing1(binSwing1, swing);
  262. getBinSwing2(binSwing2, swing);
  263. getBinSleep(binSleep, sleep);
  264. getBinTemp(binTemp, temp);
  265. getBinChecksum(binChecksum, binTemp, swing, state, mode);
  266. getBinSame1(binSame1);
  267. getBinSame2(binSame2);
  268. getBinSame3(binSame3);
  269.  
  270. sprintf(out, "%s%s%s%s%s%s%s%s%s%s%s%s", binMode, binState, binSpeed1, binSwing1, binSleep, binTemp, binSame1, binSpeed2, binSame2, binSwing2, binSame3, binChecksum);
  271.  
  272. if (DEBUG >= 1) {
  273. printf("getBinState: %s\n", binState);
  274. printf("getBinMode: %s\n", binMode);
  275. printf("getBinSpeed1: %s\n", binSpeed1);
  276. printf("getBinSpeed2: %s\n", binSpeed2);
  277. printf("getBinSwing1: %s\n", binSwing1);
  278. printf("getBinSwing2: %s\n", binSwing2);
  279. printf("getBinSleep: %s\n", binSleep);
  280. printf("getBinTemp: %s\n", binTemp);
  281. printf("getBinChecksum: %s\n", binChecksum);
  282. printf("getBinSame1: %s\n", binSame1);
  283. printf("getBinSame2: %s\n", binSame2);
  284. printf("getBinSame3: %s\n", binSame3);
  285. }
  286. if (DEBUG >= 1)
  287. printf("%s\n", out);
  288. }
  289. void toRaw(unsigned *list, char bindata[]) {
  290. unsigned n = strlen(bindata);
  291. // unsigned n = (unsigned)strlen(bindata);
  292. // int size = (n*2) + 3;
  293. // unsigned list[size];
  294.  
  295. int position = 0;
  296. int datatowrite;
  297. list[position] = 9000;
  298. list[++position] = 4500;
  299. for (int i = 0; i < n; ++i) {
  300. list[++position] = 650;
  301. if (bindata[i] == '0')
  302. list[++position] = 540;
  303. else if (bindata[i] == '2')
  304. list[++position] = 20000;
  305. else
  306. list[++position] = 1640;
  307. }
  308. list[++position] = 650;
  309.  
  310. if (DEBUG >= 2) {
  311. printf("\nPosition: %d\n", position);
  312. for (unsigned int i = 0; i != position; i+=2)
  313. {
  314. printf("%d %d\n", list[i], list[i+1]);
  315. }
  316. printf("%d\n", list[position]);
  317. }
  318. }
  319.  
  320.  
  321.  
  322.  
  323. void setup_wifi() {
  324. delay(10);
  325. // We start by connecting to a WiFi network
  326. Serial.println();
  327. Serial.print("Connecting to ");
  328. Serial.println(ssid);
  329.  
  330. WiFi.begin(ssid, password);
  331.  
  332. while (WiFi.status() != WL_CONNECTED) {
  333. delay(500);
  334. Serial.print(".");
  335. }
  336.  
  337. randomSeed(micros());
  338.  
  339. Serial.println("");
  340. Serial.println("WiFi connected");
  341. Serial.println("IP address: ");
  342. Serial.println(WiFi.localIP());
  343. }
  344.  
  345.  
  346. void reconnect() {
  347. // Loop until we're reconnected
  348. while (!client.connected()) {
  349. Serial.print("Attempting MQTT connection...");
  350. // Attempt to connect
  351. if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
  352. Serial.println("connected to MQTT");
  353. // Once connected, publish an announcement...
  354. client.publish("outTopic", "hello world");
  355. // ... and resubscribe
  356. client.subscribe("inTopic");
  357. client.subscribe("aircon/upstairs/state");
  358. client.subscribe("aircon/upstairs/mode");
  359. client.subscribe("aircon/upstairs/speed");
  360. client.subscribe("aircon/upstairs/swing");
  361. client.subscribe("aircon/upstairs/sleep");
  362. client.subscribe("aircon/upstairs/temp");
  363. } else {
  364. Serial.print("failed, rc=");
  365. Serial.print(client.state());
  366. Serial.println(" try again in 5 seconds");
  367. // Wait 5 seconds before retrying
  368. delay(5000);
  369. }
  370. }
  371. }
  372.  
  373. void callback(char* topic, byte* payload, unsigned int length) {
  374. char mqttmessage[300];
  375. Serial.print("Message arrived [");
  376. Serial.print(topic);
  377. Serial.print("] ");
  378. int i;
  379. for (i = 0; i < length; i++) {
  380. mqttmessage[i] = (char)payload[i];
  381. Serial.print(mqttmessage[i]);
  382. }
  383. mqttmessage[i] = '\0';
  384. printf("\n\ntopic: %s", topic);
  385. printf("\noriginalMessage:%s\n", mqttmessage);
  386. Serial.println();
  387.  
  388. if (strcmp(topic,"aircon/upstairs/state")==0) {
  389. strcpy(state, mqttmessage);
  390. }
  391. else if (strcmp(topic,"aircon/upstairs/mode")==0) {
  392. if (strcmp(mqttmessage, "Off")==0) {
  393. strcpy(state, mqttmessage);
  394. } else {
  395. strcpy(state, "On");
  396. strcpy(mode, mqttmessage);
  397. }
  398. }
  399. else if (strcmp(topic,"aircon/upstairs/speed")==0) {
  400. speed = (int) strtol(mqttmessage, (char **)NULL, 10);
  401. }
  402. else if (strcmp(topic,"aircon/upstairs/swing")==0) {
  403. strcpy(swing, mqttmessage);
  404. }
  405. else if (strcmp(topic,"aircon/upstairs/sleep")==0) {
  406. sleep = (int) strtol(mqttmessage, (char **)NULL, 10);;
  407. }
  408. else if (strcmp(topic,"aircon/upstairs/temp")==0) {
  409. temp = (int) strtol(mqttmessage, (char **)NULL, 10);;
  410. }
  411. printf("\n\n%s - %s - %d - %s - %d - %d \n\n", state, mode, speed, swing, sleep, temp);
  412.  
  413. char binCommand[71];
  414. getBinCommand(binCommand, state, mode, speed, swing, sleep, temp);
  415. toRaw(rawmessage, binCommand);
  416.  
  417. Serial.println("\nSending RAW data... ");
  418. irsend.sendRaw(rawmessage, 139, 38);
  419. }
  420.  
  421.  
  422.  
  423.  
  424. void setup() {
  425. // digitalWrite(4, LOW);
  426. irsend.begin();
  427. Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
  428. setup_wifi();
  429.  
  430. client.setServer(mqtt_server, 14995);
  431. client.setCallback(callback);
  432. }
  433.  
  434. void loop() {
  435.  
  436. if (!client.connected()) {
  437. reconnect();
  438. }
  439. client.loop();
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement