WHAT WE NEED TO DO ?
For this weeeks assignment we had to create an either wired or wireless Network which would be able to communicate two MCUs!!
Practically, it's my first time doing this kind, of thing and naturally I didn't have any clue and it literally took some time to adjust"my mind" to it !
So in general for a communication to happen between two MCUs, it needs to be a sender and a receiver. Communication may be in one direction or in both directions! This can take place by using only a single wire or line. Hence, for a two-way digital communication, all what we need is wires between the transmitter and receiver.
SPI (Serial peripheral interface) protocol send and receive data in a continuous stream without any interruption. This protocol is recommended for highspeed data communication is required. The maximum speed it can provide is 10 Mbps.
I2c (Inter-integrated circuit) is a two-wire bidirectional protocol used for an exchange of data between different devices on the same bus. I2c uses 7 bit or 10-bit address allowing to connect up to 1024 devices. But, it requires clock signal for generating start and stop conditions. The advantage is it provides data transfer at 400 kbps. It is suitable for onboard communication.
Unlike i2c, SPI has 4 wires. They are MOSI (Master out slave in), MISO (Master in slave out), Clock and Slave select signal. Theoretically, we can connect unlimited number of slaves and practically it depends on the load capacitance of the bus.This protocol is dedicated to vehicle systems or automobiles. It is a message-oriented protocol used for multiplex electric wiring to economize the copper. It is a multi-master multi serial bus used in applications such as automatic start/stop of vehicles, collision avoidance systems etc.
USB interface is the best alternative to serial or parallel ports. The data transfer associated with USB ports are quite faster than the serial and parallel interface. USB supports speeds from 1.5 Mbps (USB 1.0) to 4.8 Gbps (USB 3.0). Today most of the embedded devices use USB OTG (On the Go programming) technique for dumping the hex file to the microcontroller.
For this assignment I tried working with an Arduinosince we've been told that it's not necessary to make boards at first.
I decided on making an I2C bus using two Arduinos. We will program one master Arduino to command the other slave Arduino.
The only thing that it's going to be shown is the value recieved from the Master
For this part of the work I had to have code splitted in two codes to be uploaded to the Arduinos afterwards; the master code and the slave code:
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); } byte x = 0; void loop() { Wire.beginTransmission(8); Wire.write("value: "); Wire.write(x); Wire.endTransmission(); x++; delay(500); Wire.requestFrom(8, 8); while (Wire.available()) { char c = Wire.read(); Serial.print(c); } Serial.println(); delay(100); }
Before starting first of all, it's required to include the wire library first;
#include <Wire.h>
Wire.begin();
,this function is like adressing the master to join the I2C bus. If no argument is provided in the function, Arduino will begin working as a master.
Then we use the following functions to
begin a transmission to the device with the address 8, write the character, and then stop the transmission:
Wire.beginTransmission(8);
Wire.write("value: ");
Wire.write(x);
Wire.endTransmission()
TWire.h library here, but now we start the I2C bus using Wire.begin(8)
. This is like an invitation for the Arduino to join the I2C bus under the adresse 8: so in general all devices with address 8 will receive the transmission.
The data(byte) received from the Master are received as Characterchar c = Wire.read();
and printed afterward!!
After receiving the data the Arduino responds with message of 8 bytes: Wire.write("Received");
#include <Wire.h> void setup() { Wire.begin(8); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); Serial.begin(9600); } void loop() { delay(100); } void receiveEvent(int howMany) { while (1 < Wire.available()) { char c = Wire.read(); Serial.print(c); } int x = Wire.read(); Serial.println(x); } void requestEvent() { Wire.write("Received"); }
For this weeks assignment , I decided to make an ESP-12E Module board
Designing the board
As I already said, I'm going to
And the piece of art is ready to be soldered
For this board what I needed is the following:
Since you're not going to upload the code to our usual microship, therefore you need to make some changes in the Arduino app
Go to FILE>PREFERENCES and then copy and paste this link as shown bellow in additional Board manager URLs https://arduino.esp8266.com/stable/package_esp8266com_index.json
Then download the library of the ESP8266 Boards
and then connect the 4 PINsRX to RX , TX to TX, GND to GND and the VCC to the VCC to the ARDUINO to upload the code and while the code is uploading I needed to keep clicking on one of the PUSH BUTTONS the programmer ,and one click on the RESET button
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #ifndef STASSID #define STASSID "your-ssid" #define STAPSK "your-password" #endif const char* ssid = STASSID; const char* password = STAPSK; ESP8266WebServer server(80); //Check if header is present and correct bool is_authenticated() { Serial.println("Enter is_authenticated"); if (server.hasHeader("Cookie")) { Serial.print("Found cookie: "); String cookie = server.header("Cookie"); Serial.println(cookie); if (cookie.indexOf("ESPSESSIONID=1") != -1) { Serial.println("Authentication Successful"); return true; } } Serial.println("Authentication Failed"); return false; } //login page, also called for disconnect void handleLogin() { String msg; if (server.hasHeader("Cookie")) { Serial.print("Found cookie: "); String cookie = server.header("Cookie"); Serial.println(cookie); } if (server.hasArg("DISCONNECT")) { Serial.println("Disconnection"); server.sendHeader("Location", "/login"); server.sendHeader("Cache-Control", "no-cache"); server.sendHeader("Set-Cookie", "ESPSESSIONID=0"); server.send(301); return; } if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")) { if (server.arg("USERNAME") == "admin" && server.arg("PASSWORD") == "admin") { server.sendHeader("Location", "/"); server.sendHeader("Cache-Control", "no-cache"); server.sendHeader("Set-Cookie", "ESPSESSIONID=1"); server.send(301); Serial.println("Log in Successful"); return; } msg = "Wrong username/password! try again."; Serial.println("Log in Failed"); } String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>"; content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>"; content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>"; content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>"; content += "You also can go <a href='/inline'>here</a></body></html>"; server.send(200, "text/html", content); } //root page can be accessed only if authentication is ok void handleRoot() { Serial.println("Enter handleRoot"); String header; if (!is_authenticated()) { server.sendHeader("Location", "/login"); server.sendHeader("Cache-Control", "no-cache"); server.send(301); return; } String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>"; if (server.hasHeader("User-Agent")) { content += "the user agent used is : " + server.header("User-Agent") + "<br><br>"; } content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>"; server.send(200, "text/html", content); } //no need authentication void handleNotFound() { String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\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) { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); server.on("/", handleRoot); server.on("/login", handleLogin); server.on("/inline", []() { server.send(200, "text/plain", "this works without need of authentication"); }); server.onNotFound(handleNotFound); //ask server to track these headers server.collectHeaders("User-Agent", "Cookie"); server.begin(); Serial.println("HTTP server started"); } void loop(void) { server.handleClient(); }
After I programmed it and checked that it works, I had to make something using it, so since I didn't put any LED connected directly to the ESP, I put a one in the bread board, one side is connected to GND and the other with a 1O Ohm resistor to theGIO10 of the board
So the code for this one is the following
// Load Wi-Fi library #include <ESP8266WiFi.h> // Replace with your network credentials const char* ssid = "El FabSpace Lac"; const char* password = "Think_Make_Share"; // Set web server port number to 80 WiFiServer server(80); // Variable to store the HTTP request String header; // Auxiliar variables to store the current output state String output5State = "off"; String output4State = "off"; // Assign output variables to GPIO pins #define output5 10 void setup() { Serial.begin(115200); // Initialize the output variables as outputs pinMode(output5, OUTPUT); // Set outputs to LOW digitalWrite(output5, LOW); // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop(){ WiFiClient client = server.available(); // Listen for incoming clients if (client) { // If a new client connects, Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) { // loop while the client's connected if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // turns the GPIOs on and off if (header.indexOf("GET /5/on") >= 0) { Serial.println("Light on"); output5State = "on"; digitalWrite(output5, HIGH); } else if (header.indexOf("GET /5/off") >= 0) { Serial.println("Light off"); output5State = "off"; digitalWrite(output5, LOW); } // Display the HTML web page client.println("<html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;"); client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}"); client.println(".button2 {background-color: #77878A;}</style></head>"); // Web Page Heading client.println("<body><h1>ESP8266 Web Server</h1>"); // Display current state, and ON/OFF buttons for GPIO 5 client.println("<p>Light - State " + output5State + "</p>"); // If the output5State is off, it displays the ON button if (output5State=="off") { client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>"); } else { client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>"); } // Break out of the while loop break; }else { // if you got a newline, then clear currentLine currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } // Clear the header variable header = ""; // Close the connection client.stop(); Serial.println("Client disconnected."); Serial.println(""); } }
while it starts to upload, keep pushing the Program button and then one click on the the RESET
Host: 192.168.2.16
in your browserFor this We had to send a message between two projects
Here's the direct link for this part of the Assignment