├── .gitignore ├── LICENSE ├── README.md ├── esp8266.c └── esp8266.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Object files 2 | *.o 3 | *.ko 4 | *.obj 5 | *.elf 6 | 7 | # Precompiled Headers 8 | *.gch 9 | *.pch 10 | 11 | # Libraries 12 | *.lib 13 | *.a 14 | *.la 15 | *.lo 16 | 17 | # Shared objects (inc. Windows DLLs) 18 | *.dll 19 | *.so 20 | *.so.* 21 | *.dylib 22 | 23 | # Executables 24 | *.exe 25 | *.out 26 | *.app 27 | *.i*86 28 | *.x86_64 29 | *.hex 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP8266_PIC 2 | C library for interfacing the ESP8266 Wi-Fi module with a PIC microcontroller 3 | 4 | This library 5 | 6 | - is tested with XC8; 7 | - should work on any 8-bit PIC (and possibly also larger systems and AVR); 8 | - has an [example project](https://github.com/camilstaps/ESP8266_PIC/releases/tag/example) 9 | available **for an older version of XC8** (when `plib.h` still existed); 10 | - is sadly incomplete, because I stopped working with the ESP8266 quickly. 11 | 12 | ## Support 13 | This was a quick hobby project and is released here for your benefit. 14 | Unfortunately, I do not have the time for support if you cannot get it working. 15 | Please take questions to your favourite discussion forum instead. 16 | 17 | ## Author & License 18 | Copyright © [Camil Staps][cs]. 19 | Licensed under GNU GPLv2 (see the [LICENSE](/LICENSE) file for more details). 20 | 21 | [cs]: https://camilstaps.nl 22 | -------------------------------------------------------------------------------- /esp8266.c: -------------------------------------------------------------------------------- 1 | /** 2 | * C library for the ESP8266 WiFi module with a PIC microcontroller 3 | * Copyright (C) 2015 Camil Staps 4 | * 5 | * This program is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 2 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with this program; if not, write to the Free Software Foundation, Inc., 17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 | * 19 | ***************************************************************************** 20 | * 21 | * File: esp8266.c 22 | * Author: Camil Staps 23 | * Website: http://github.com/camilstaps/ESP8266_PIC 24 | * Version: 0.1 25 | * 26 | * See: esp8266.h 27 | * 28 | * C library for interfacing the ESP8266 Wi-Fi transceiver module with a PIC18 29 | * microcontroller. Should be used with the XC8 compiler. 30 | */ 31 | 32 | #include "esp8266.h" 33 | #include 34 | #include 35 | 36 | unsigned char *lit_OK=(unsigned char*)"OK"; 37 | 38 | /** 39 | * Check if the module is started 40 | * 41 | * This sends the `AT` command to the ESP and waits until it gets a response. 42 | * 43 | * @return true if the module is started, false if something went wrong 44 | */ 45 | bit esp8266_isStarted(void) { 46 | _esp8266_print("AT\r\n"); 47 | return (_esp8266_waitResponse() == ESP8266_OK); 48 | } 49 | 50 | /** 51 | * Restart the module 52 | * 53 | * This sends the `AT+RST` command to the ESP and waits until there is a 54 | * response. 55 | * 56 | * @return true iff the module restarted properly 57 | */ 58 | bit esp8266_restart(void) { 59 | _esp8266_print("AT+RST\r\n"); 60 | if (_esp8266_waitResponse() != ESP8266_OK) { 61 | return false; 62 | } 63 | return (_esp8266_waitResponse() == ESP8266_READY); 64 | } 65 | 66 | /** 67 | * Enable / disable command echoing. 68 | * 69 | * Enabling this is useful for debugging: one could sniff the TX line from the 70 | * ESP8266 with his computer and thus receive both commands and responses. 71 | * 72 | * This sends the ATE command to the ESP module. 73 | * 74 | * @param echo whether to enable command echoing or not 75 | */ 76 | void esp8266_echoCmds(bool echo) { 77 | _esp8266_print("ATE"); 78 | if (echo) { 79 | _esp8266_putch('1'); 80 | } else { 81 | _esp8266_putch('0'); 82 | } 83 | _esp8266_print("\r\n"); 84 | _esp8266_waitFor(lit_OK); 85 | } 86 | 87 | /** 88 | * Set the WiFi mode. 89 | * 90 | * ESP8266_STATION : Station mode 91 | * ESP8266_SOFTAP : Access point mode 92 | * 93 | * This sends the AT+CWMODE command to the ESP module. 94 | * 95 | * @param mode an ORed bitmask of ESP8266_STATION and ESP8266_SOFTAP 96 | */ 97 | void esp8266_mode(unsigned char mode) { 98 | _esp8266_print("AT+CWMODE="); 99 | _esp8266_putch(mode + '0'); 100 | _esp8266_print("\r\n"); 101 | _esp8266_waitResponse(); 102 | } 103 | 104 | /** 105 | * Connect to an access point. 106 | * 107 | * This sends the AT+CWJAP command to the ESP module. 108 | * 109 | * @param ssid The SSID to connect to 110 | * @param pass The password of the network 111 | * @return an ESP status code, normally either ESP8266_OK or ESP8266_FAIL 112 | */ 113 | unsigned char esp8266_connect(unsigned char* ssid, unsigned char* pass) { 114 | _esp8266_print("AT+CWJAP=\""); 115 | _esp8266_print(ssid); 116 | _esp8266_print("\",\""); 117 | _esp8266_print(pass); 118 | _esp8266_print("\"\r\n"); 119 | return _esp8266_waitResponse(); 120 | } 121 | 122 | /** 123 | * Disconnect from the access point. 124 | * 125 | * This sends the AT+CWQAP command to the ESP module. 126 | */ 127 | void esp8266_disconnect(void) { 128 | _esp8266_print("AT+CWQAP\r\n"); 129 | _esp8266_waitFor(lit_OK); 130 | } 131 | 132 | /** 133 | * Store the current local IPv4 address. 134 | * 135 | * This sends the AT+CIFSR command to the ESP module. 136 | * 137 | * The result will not be stored as a string but byte by byte. For example, for 138 | * the IP 192.168.0.1, the value of store_in will be: {0xc0, 0xa8, 0x00, 0x01}. 139 | * 140 | * @param store_in a pointer to an array of the type unsigned char[4]; this 141 | * array will be filled with the local IP. 142 | */ 143 | void esp8266_ip(unsigned char* store_in) { 144 | _esp8266_print("AT+CIFSR\r\n"); 145 | unsigned char received; 146 | do { 147 | received = _esp8266_getch(); 148 | } while (received < '0' || received > '9'); 149 | for (unsigned char i = 0; i < 4; i++) { 150 | store_in[i] = 0; 151 | do { 152 | store_in[i] = 10 * store_in[i] + received - '0'; 153 | received = _esp8266_getch(); 154 | } while (received >= '0' && received <= '9'); 155 | received = _esp8266_getch(); 156 | } 157 | _esp8266_waitFor(lit_OK); 158 | } 159 | 160 | /** 161 | * Open a TCP or UDP connection. 162 | * 163 | * This sends the AT+CIPSTART command to the ESP module. 164 | * 165 | * @param protocol Either ESP8266_TCP or ESP8266_UDP 166 | * @param ip The IP or hostname to connect to; as a string 167 | * @param port The port to connect to 168 | * 169 | * @return true iff the connection is opened after this. 170 | */ 171 | bit esp8266_start(unsigned char protocol, char* ip, unsigned char port) { 172 | _esp8266_print("AT+CIPSTART=\""); 173 | if (protocol == ESP8266_TCP) { 174 | _esp8266_print("TCP"); 175 | } else { 176 | _esp8266_print("UDP"); 177 | } 178 | _esp8266_print("\",\""); 179 | _esp8266_print(ip); 180 | _esp8266_print("\","); 181 | unsigned char port_str[5] = "\0\0\0\0"; 182 | sprintf(port_str, "%u", port); 183 | _esp8266_print(port_str); 184 | _esp8266_print("\r\n"); 185 | if (_esp8266_waitResponse() != ESP8266_OK) { 186 | return 0; 187 | } 188 | if (_esp8266_waitResponse() != ESP8266_LINKED) { 189 | return 0; 190 | } 191 | return 1; 192 | } 193 | 194 | // Send data (AT+CIPSEND) 195 | /** 196 | * Send data over a connection. 197 | * 198 | * This sends the AT+CIPSEND command to the ESP module. 199 | * 200 | * @param data The data to send 201 | * 202 | * @return true iff the data was sent correctly. 203 | */ 204 | bit esp8266_send(unsigned char* data) { 205 | unsigned char length_str[6] = "\0\0\0\0\0"; 206 | sprintf(length_str, "%u", strlen(data)); 207 | _esp8266_print("AT+CIPSEND="); 208 | _esp8266_print(length_str); 209 | _esp8266_print("\r\n"); 210 | while (_esp8266_getch() != '>'); 211 | _esp8266_print(data); 212 | if (_esp8266_waitResponse() == ESP8266_OK) { 213 | return 1; 214 | } 215 | return 0; 216 | } 217 | 218 | /** 219 | * Read a string of data that is sent to the ESP8266. 220 | * 221 | * This waits for a +IPD line from the module. If more bytes than the maximum 222 | * are received, the remaining bytes will be discarded. 223 | * 224 | * @param store_in a pointer to a character array to store the data in 225 | * @param max_length maximum amount of bytes to read in 226 | * @param discard_headers if set to true, we will skip until the first \r\n\r\n, 227 | * for HTTP this means skipping the headers. 228 | */ 229 | void esp8266_receive(unsigned char* store_in, uint16_t max_length, bool discard_headers) { 230 | _esp8266_waitFor((unsigned char*)"+IPD,"); 231 | uint16_t length = 0; 232 | unsigned char received = _esp8266_getch(); 233 | do { 234 | length = length * 10 + received - '0'; 235 | received = _esp8266_getch(); 236 | } while (received >= '0' && received <= '9'); 237 | 238 | if (discard_headers) { 239 | length -= _esp8266_waitFor((unsigned char*)"\r\n\r\n"); 240 | } 241 | 242 | if (length < max_length) { 243 | max_length = length; 244 | } 245 | 246 | /*sprintf(store_in, "%u,%u:%c%c", length, max_length, _esp8266_getch(), _esp8266_getch()); 247 | return;*/ 248 | 249 | uint16_t i; 250 | for (i = 0; i < max_length; i++) { 251 | store_in[i] = _esp8266_getch(); 252 | } 253 | store_in[i] = 0; 254 | for (; i < length; i++) { 255 | _esp8266_getch(); 256 | } 257 | _esp8266_waitFor(lit_OK); 258 | } 259 | 260 | /** 261 | * Output a string to the ESP module. 262 | * 263 | * This is a function for internal use only. 264 | * 265 | * @param ptr A pointer to the string to send. 266 | */ 267 | void _esp8266_print(unsigned const char *ptr) { 268 | while (*ptr != 0) { 269 | _esp8266_putch(*ptr++); 270 | } 271 | } 272 | 273 | /** 274 | * Wait until we found a string on the input. 275 | * 276 | * Careful: this will read everything until that string (even if it's never 277 | * found). You may lose important data. 278 | * 279 | * @param string 280 | * 281 | * @return the number of characters read 282 | */ 283 | inline uint16_t _esp8266_waitFor(unsigned char *string) { 284 | unsigned char so_far = 0; 285 | unsigned char received; 286 | uint16_t counter = 0; 287 | do { 288 | received = _esp8266_getch(); 289 | counter++; 290 | if (received == string[so_far]) { 291 | so_far++; 292 | } else { 293 | so_far = 0; 294 | } 295 | } while (string[so_far] != 0); 296 | return counter; 297 | } 298 | 299 | /** 300 | * Wait until we received the ESP is done and sends its response. 301 | * 302 | * This is a function for internal use only. 303 | * 304 | * Currently the following responses are implemented: 305 | * * OK 306 | * * ready 307 | * * FAIL 308 | * * no change 309 | * * Linked 310 | * * Unlink 311 | * 312 | * Not implemented yet: 313 | * * DNS fail (or something like that) 314 | * 315 | * @return a constant from esp8266.h describing the status response. 316 | */ 317 | inline unsigned char _esp8266_waitResponse(void) { 318 | unsigned char so_far[6] = {0,0,0,0,0,0}; 319 | unsigned const char lengths[6] = {2,5,4,9,6,6}; 320 | unsigned const char* strings[6] = {"OK", "ready", "FAIL", "no change", "Linked", "Unlink"}; 321 | unsigned const char responses[6] = {ESP8266_OK, ESP8266_READY, ESP8266_FAIL, ESP8266_NOCHANGE, ESP8266_LINKED, ESP8266_UNLINK}; 322 | unsigned char received; 323 | unsigned char response; 324 | bool continue_loop = true; 325 | while (continue_loop) { 326 | received = _esp8266_getch(); 327 | for (unsigned char i = 0; i < 6; i++) { 328 | if (strings[i][so_far[i]] == received) { 329 | so_far[i]++; 330 | if (so_far[i] == lengths[i]) { 331 | response = responses[i]; 332 | continue_loop = false; 333 | } 334 | } else { 335 | so_far[i] = 0; 336 | } 337 | } 338 | } 339 | return response; 340 | } 341 | -------------------------------------------------------------------------------- /esp8266.h: -------------------------------------------------------------------------------- 1 | /** 2 | * C library for the ESP8266 WiFi module with a PIC microcontroller 3 | * Copyright (C) 2015 Camil Staps 4 | * 5 | * This program is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 2 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with this program; if not, write to the Free Software Foundation, Inc., 17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 | * 19 | ***************************************************************************** 20 | * 21 | * File: esp8266.h 22 | * Author: Camil Staps 23 | * Website: http://github.com/camilstaps/ESP8266_PIC 24 | * Version: 0.1 25 | * 26 | * See: esp8266.c 27 | * 28 | * This is the header file for the ESP8266 PIC18 library. It contains: 29 | * 30 | * * Constants and bitmasks 31 | * * Prototypes for functions that should be written by the user for his 32 | * implementation 33 | * * Prototypes for functions that can be used by the user 34 | * * Prototypes for functions that are intended for internal use only 35 | */ 36 | 37 | #include 38 | #include 39 | 40 | #ifndef ESP8266_H 41 | #define ESP8266_H 42 | 43 | #ifdef __cplusplus 44 | extern "C" { 45 | #endif 46 | 47 | /** Some constants **/ 48 | 49 | #define ESP8266_STATION 0x01 50 | #define ESP8266_SOFTAP 0x02 51 | 52 | #define ESP8266_TCP 1 53 | #define ESP8266_UDP 0 54 | 55 | #define ESP8266_OK 1 56 | #define ESP8266_READY 2 57 | #define ESP8266_FAIL 3 58 | #define ESP8266_NOCHANGE 4 59 | #define ESP8266_LINKED 5 60 | #define ESP8266_UNLINK 6 61 | 62 | /** Should be witten by the user for input from / output to the ESP module **/ 63 | 64 | void _esp8266_putch(unsigned char); 65 | unsigned char _esp8266_getch(void); 66 | 67 | /** Function prototypes **/ 68 | 69 | bit esp8266_isStarted(void); // Check if the module is started (AT) 70 | bit esp8266_restart(void); // Restart module (AT+RST) 71 | void esp8266_echoCmds(bool); // Enabled/disable command echoing (ATE) 72 | 73 | // WIFI Mode (station/softAP/station+softAP) (AT+CWMODE) 74 | void esp8266_mode(unsigned char); 75 | 76 | // Connect to AP (AT+CWJAP) 77 | unsigned char esp8266_connect(unsigned char*, unsigned char*); 78 | 79 | // Disconnect from AP (AT+CWQAP) 80 | void esp8266_disconnect(void); 81 | 82 | // Local IP (AT+CIFSR) 83 | void esp8266_ip(char*); 84 | 85 | // Create connection (AT+CIPSTART) 86 | bit esp8266_start(unsigned char protocol, char* ip, unsigned char port); 87 | 88 | // Send data (AT+CIPSEND) 89 | bit esp8266_send(unsigned char*); 90 | 91 | // Receive data (+IPD) 92 | void esp8266_receive(unsigned char*, uint16_t, bool); 93 | 94 | /** Functions for internal use only **/ 95 | 96 | // Print a string to the output 97 | void _esp8266_print(unsigned const char *); 98 | 99 | // Wait for a certain string on the input 100 | inline uint16_t _esp8266_waitFor(unsigned char *); 101 | // Wait for any response on the input 102 | inline unsigned char _esp8266_waitResponse(void); 103 | 104 | #ifdef __cplusplus 105 | } 106 | #endif 107 | 108 | #endif /* ESP8266_H */ 109 | --------------------------------------------------------------------------------