14. Networking and communications¶
For my final project my goal is to use the ESP8266 to read sensor value from an ultrasonic sensor and turn on leds and motors. For this board I am going to attempt to build a PCB for the ESP8266 that has a transistor to control the motors or LED and pins for the ultrasonic sensor.
Files¶
ESP8266 Ultrasonic/LED output board Board: Eagle: Schematic | Board
Designing ESP8266 Board¶
I started the week by building Neil’s ESP8266 board. I also added an ICSP header to make programming easier and consistant with the other weeks. The circuit is really basic. There is a 3.3v voltage regulator to ensure that all voltage hitting the ESP8266 is 3.3v since that is what the chip is rated for.
Several of the pins a connected to VCC CH_PD pin to enable the chip, GPIO0 to select normal boot mode, and the RST (reset) pin to prevent random resets.

Once the schematic was arranged I moved over to the board view and moved the components and routed the wires.

Adding a Transistor for Motor/LED control¶
I added a PNP transistor to the circuit to allow me to control a output over 3.3volts. The transistor is hooked up to the 3v3 volt but it could be routed to a pin to connect external power isolated from the ESP8266.

Adding Pins for Ultra Sonic Sensor¶
At the bottom you can see the pins added for the ultra sonic sensor. Two of the pins are for power and two of the pins are for the trigger and reciever pin.

Fabricating and Stuffing the Board¶

What is UDP¶
UDP stands for User Datagram Protocol and is simplar to TCP protocal like computers use. The main difference is that it has no error checking like TCP. The UDP packets are sent out without any care if they were recieved. You can see this in the test I did where I send a string of character via serial and if the string was really long and too close to the previous one some might be missed. TCP actually waits for a handshake back from the recipient before sending the next packet. The good thing about UDP is it is fast because of the no error checking. The code below sends the reading over and over again. If one packet is missed it is no big deal because it can catch the next one.

How UPD Client & Server works¶
So, I’m using the UDP library to send packets from one ESP8266 board to another. The board I made reads the distance from an ultrasonic sensor and if the distance is less than 10cm the LED starts flashing. At the same time the board sends the value from the client board to the server board. The value can be read over serial on the server board.

Client Code¶
/*
Wireless Serial using UDP ESP8266
Circuits4you.com
2018
Slave Board connects to Access Point
Edited by Brent Richardson 7/8/19
*/
#include <ESP8266WiFi.h> //Libraries
#include <WiFiUdp.h>
const char *ssid = "brentwifi"; //This SSID is being created in the server code
//the client must match to communicate This code doesn't actually use the internet
const char *pass = "password";
unsigned int localPort = 2000; // local port to listen for UDP packets
IPAddress ServerIP(192,168,4,1); //This is the IP address of the server and client being hard coded
IPAddress ClientIP(192,168,4,2);
// A UDP instance to let us send and receive packets over UDP
WiFiUDP udp;
char packetBuffer[9]; //Where we get the UDP data
#define LEDpin 4 //make a pin to send signal to speaker
#define trigPin 14 //pins for ultra sonic sensor
#define echoPin 16
long duration, cm, inches;
//======================================================================
// Setup
//======================================================================
void setup()
{
Serial.begin(9600);
Serial.println();
WiFi.begin(ssid, pass); //Connect to access point
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());
//Start UDP
Serial.println("Starting UDP");
udp.begin(localPort);
Serial.print("Local port: ");
Serial.println(udp.localPort());
pinMode(trigPin, OUTPUT); //Set pins to input and out for sensor
pinMode(echoPin, INPUT);
pinMode(LEDpin, OUTPUT);
}
//======================================================================
// MAIN LOOP
//======================================================================
void loop()
{
digitalWrite(trigPin, LOW); //this code send voltage down the trigger pin and causes the sensor to emit an ultrasonic wave for 10 microseconds
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read the signal from the sensor: a HIGH pulse whose
// duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
// Convert the time into a distance
cm = (duration/2) * .0343; // Divide by 29.1 or multiply by 0.0343
inches = (duration/2) *.0343; // Divide by 74 or multiply by 0.0135
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
if(cm>=25)
{
analogWrite(LEDPin, HIGH );
delay(1000);
analogWrite(LEDPin, LOW );
delay(500);
analogWrite(LEDPin, HIGH );
delay(1000);
analogWrite(LEDPin, LOW );
delay(500);
analogWrite(LEDPin, HIGH );
delay(1000);
analogWrite(LEDPin, LOW );
delay(500);
}
//----------------------Below sends the measurement to the server board over UPD
int cb = udp.parsePacket();
if (!cb)
{
//If serial data is recived send it to UDP
if(Serial.available()>0)
{
udp.beginPacket(ServerIP, 2000); //Send Data to Master unit
//Send UDP requests are to port 2000
char a[1];
a[0]=char(Serial.read()); //Serial Byte Read and add the character to the array
udp.write(a,1); //Send one byte to ESP8266
udp.endPacket();
}
}
else {
// We've received a UDP packet, send it to serial
udp.read(packetBuffer, 1); // read the packet into the buffer, we are reading only one byte
Serial.print(packetBuffer);
delay(20);
}
}
//=======================================================================
Server Code¶
Use the three backticks to separate code.
/*
Wireless Serial using UDP ESP8266
Circuits4you.com
2018
Master Board creates Access Point
Edited BY Brent Richardson
7/8/19
*/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "brentwifi";
const char *pass = "password";
unsigned int localPort = 2000; // local port to listen for UDP packets
IPAddress ServerIP(192,168,4,1);
IPAddress ClientIP(192,168,4,2);
// A UDP instance to let us send and receive packets over UDP
WiFiUDP udp;
char packetBuffer[9]; //Where we get the UDP data
//=======================================================================
// Setup
//=======================================================================
void setup()
{
Serial.begin(9600);
Serial.println();
WiFi.softAP(ssid, pass); //Create Access point
//Start UDP
Serial.println("Starting UDP");
udp.begin(localPort);
Serial.print("Local port: ");
Serial.println(udp.localPort());
}
//======================================================================
// MAIN LOOP
//======================================================================
void loop()
{
int cb = udp.parsePacket();
if (!cb)
{
//If serial data is recived send it to UDP
if(Serial.available()>0)
{
udp.beginPacket(ClientIP, 2000);
//Send UDP requests are to port 2000
char a[1];
a[0]=char(Serial.read()); //Serial Byte Read
udp.write(a,1); //Send one byte to ESP8266
udp.endPacket();
}
}
else {
// We've received a UDP packet, send it to serial
udp.read(packetBuffer, 1); // read the packet into the buffer, we are reading only one byte
Serial.print(packetBuffer);
delay(20);
}
}
//======================================================================