I have tried ESPnow before, but with this code, the sender fails to recieve, even though both the sender and recievered are initialized
Here's the code for the ESP32 CAM (My Sender) :
//Last time, it wasn't obivious enough that I was the one who wrote my code and that I should add more comments to my code to show that I understand how the code works. That being said, enjoy my notes! :D
//Libraries
#include "esp_wifi.h"
#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "esp_http_server.h"
#include <esp_now.h>
#include <WebServer.h>
// WiFi Password
const char *ssid = "***CENSORED***";
const char *password = "***CENSORED***";
WebServer server(80);
//ESP32-WROOM MAC ADDRESS
uint8_t broadcastAddress[] = { 0xE0, 0x5A, 0x1B, 0xAC, 0x5A, 0xF8 };
#define PART_BOUNDARY "123456789000000000000987654321"
#define CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
//ESP NOW
typedef struct struct_message {
int b;
} struct_message;
struct_message myData;
esp_now_peer_info_t peerInfo;
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
static const char *_STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char *_STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char *_STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";
httpd_handle_t camera_httpd = NULL;
httpd_handle_t stream_httpd = NULL;
static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<html>
<head>
<title>Terra</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: Arial; text-align: center; margin:0px auto; padding-top: 30px;}
table { margin-left: auto; margin-right: auto; }
td { padding: 8 px; }
.button {
background-color: #842593;
border: none;
color: white;
padding: 10px 20px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 18px;
margin: 6px 3px;
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
img { width: auto ;
max-width: 100% ;
height: auto ;
}
</style>
</head>
<body>
<h1>Cave Research Robot</h1>
<img src="" id="photo" >
<table>
<tr><td colspan="3" align="center"><button class="button" onmousedown="toggleCheckbox('forward');" ontouchstart="toggleCheckbox('forward');" onmouseup="toggleCheckbox('stop');" ontouchend="toggleCheckbox('stop');">Forward</button></td></tr>
<tr><td align="center"><button class="button" onmousedown="toggleCheckbox('left');" ontouchstart="toggleCheckbox('left');" onmouseup="toggleCheckbox('stop');" ontouchend="toggleCheckbox('stop');">Left</button></td><td align="center"><button class="button" onmousedown="toggleCheckbox('stop');" ontouchstart="toggleCheckbox('stop');">Stop</button></td><td align="center"><button class="button" onmousedown="toggleCheckbox('right');" ontouchstart="toggleCheckbox('right');" onmouseup="toggleCheckbox('stop');" ontouchend="toggleCheckbox('stop');">Right</button></td></tr>
<tr><td colspan="3" align="center"><button class="button" onmousedown="toggleCheckbox('backward');" ontouchstart="toggleCheckbox('backward');" onmouseup="toggleCheckbox('stop');" ontouchend="toggleCheckbox('stop');">Backward</button></td></tr>
</table>
</head>
<body>
<br>
<br>
<section class="main">
<figure>
<div id="stream-container" class="image-container">
<div class="close" id="close-stream">×</div>
<img id="stream" src="" class="rotate90">
</div>
</figure>
<br>
<br>
<h4>Distance (Meters): <span id="DISvalue">0</span></h4>
</section>
<script>
function toggleCheckbox(x) {
var xhr = new XMLHttpRequest();
xhr.open("GET", "/action?go=" + x, true);
xhr.send();
}
setInterval(function() {getSensorData();}, 1000); // Call the update function every second
function getSensorData() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
document.getElementByld("DISvalue").innerHTML = this.responseText;
}
};
xhttp.open("GET", "DISread", true);
xhttp.send();
}
window.onload = document.getElementById("photo").src = window.location.href.slice(0, -1) + ":81/stream";
</script>
</body>
</html>
)rawliteral";
static esp_err_t index_handler(httpd_req_t *req) {
httpd_resp_set_type(req, "text/html");
return httpd_resp_send(req, (const char *)INDEX_HTML, strlen(INDEX_HTML));
}
static esp_err_t stream_handler(httpd_req_t *req) {
camera_fb_t *fb = NULL;
esp_err_t res = ESP_OK;
size_t _jpg_buf_len = 0;
uint8_t *_jpg_buf = NULL;
char *part_buf[64];
res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
if (res != ESP_OK) {
return res;
}
while (true) {
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
res = ESP_FAIL;
} else {
if (fb->width > 400) {
if (fb->format != PIXFORMAT_JPEG) {
bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
esp_camera_fb_return(fb);
fb = NULL;
if (!jpeg_converted) {
Serial.println("JPEG compression failed");
res = ESP_FAIL;
}
} else {
_jpg_buf_len = fb->len;
_jpg_buf = fb->buf;
}
}
}
if (res == ESP_OK) {
size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
}
if (res == ESP_OK) {
res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
}
if (res == ESP_OK) {
res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
}
if (fb) {
esp_camera_fb_return(fb);
fb = NULL;
_jpg_buf = NULL;
} else if (_jpg_buf) {
free(_jpg_buf);
_jpg_buf = NULL;
}
if (res != ESP_OK) {
break;
}
//Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
}
return res;
}
static esp_err_t cmd_handler(httpd_req_t *req) {
char *buf;
size_t buf_len;
char variable[32] = {
0,
};
buf_len = httpd_req_get_url_query_len(req) + 1;
if (buf_len > 1) {
buf = (char *)malloc(buf_len);
if (!buf) {
httpd_resp_send_500(req);
return ESP_FAIL;
}
if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
if (httpd_query_key_value(buf, "go", variable, sizeof(variable)) == ESP_OK) {
} else {
free(buf);
httpd_resp_send_404(req);
return ESP_FAIL;
}
} else {
free(buf);
httpd_resp_send_404(req);
return ESP_FAIL;
}
free(buf);
} else {
httpd_resp_send_404(req);
return ESP_FAIL;
}
sensor_t *s = esp_camera_sensor_get();
int res = 0;
if (!strcmp(variable, "forward")) {
Serial.println("Forward");
// Set values to send
myData.b = (1);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
} else {
Serial.println("Error sending the data");
}
} else if (!strcmp(variable, "left")) {
Serial.println("Left");
// Set values to send
myData.b = (2);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
} else {
Serial.println("Error sending the data");
}
} else if (!strcmp(variable, "right")) {
Serial.println("Right");
// Set values to send
myData.b = (3);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
} else {
Serial.println("Error sending the data");
}
} else if (!strcmp(variable, "backward")) {
Serial.println("Backward");
// Set values to send
myData.b = (4);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
} else {
Serial.println("Error sending the data");
}
} else if (!strcmp(variable, "stop")) {
Serial.println("Stop");
// Set values to send
myData.b = (5);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
} else {
Serial.println("Error sending the data");
}
} else {
res = -1;
}
if (res) {
return httpd_resp_send_500(req);
}
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
return httpd_resp_send(req, NULL, 0);
}
void handleDIS(){
String dis = String(readUltrasonicDistance(13, 12), 2);
server.send(200, "text/plain", dis);
}
void startCameraServer() {
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.server_port = 80;
httpd_uri_t index_uri = {
.uri = "/",
.method = HTTP_GET,
.handler = index_handler,
.user_ctx = NULL
};
httpd_uri_t cmd_uri = {
.uri = "/action",
.method = HTTP_GET,
.handler = cmd_handler,
.user_ctx = NULL
};
httpd_uri_t stream_uri = {
.uri = "/stream",
.method = HTTP_GET,
.handler = stream_handler,
.user_ctx = NULL
};
if (httpd_start(&camera_httpd, &config) == ESP_OK) {
httpd_register_uri_handler(camera_httpd, &index_uri);
httpd_register_uri_handler(camera_httpd, &cmd_uri);
}
config.server_port += 1;
config.ctrl_port += 1;
if (httpd_start(&stream_httpd, &config) == ESP_OK) {
httpd_register_uri_handler(stream_httpd, &stream_uri);
}
}
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
Serial.setDebugOutput(false);
// Connect to Wi-Fi network with SSID and password
Serial.print("Setting AP (Access Point)…");
// Remove the password parameter, if you want the AP (Access Point) to be open
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
server.begin();
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent);
// Register peer
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
if (psramFound()) {
config.frame_size = FRAMESIZE_VGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
// Camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
// Start streaming web server
startCameraServer();
server.on("/DISread", handleDIS);
}
long readUltrasonicDistance(int triggerPin, int echoPin) {
pinMode(triggerPin, OUTPUT); // Clear the trigger
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
// Sets the trigger pin to HIGH state for 10 microseconds
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
// Reads the echo pin, and returns the sound wave travel time in microseconds
return pulseIn(echoPin, HIGH);
}
void loop() {
}
Here's the code for the ESP32 WROOM (My Reciever):
//Libraries
#include <esp_now.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include "esp_wifi.h"
//Chanel
#define CHANNEL 1
//Servos
Servo shoulder1;
Servo elbow1;
Servo shoulder2;
Servo elbow2;
Servo hip3;
Servo knee3;
Servo hip4;
Servo knee4;
//Starting position based on how servos are installed
int s1 = 90;
int s2 = 90;
int h3 = 90;
int h4 = 90;
int e1 = 90;
int e2 = 90;
int k3 = 90;
int k4 = 90;
//Delays
int d1 = 500;
int d2 = 1000;
int d3 = 50;
int d4 = 75;
int d5 = 100;
int d6 = 3000;
int m = 0;
//servo GPIO pins
int s1Pin = 19;
int e1Pin = 18;
int s2Pin = 5;
int e2Pin = 17;
int h3Pin = 16;
int k3Pin = 4;
int h4Pin = 2;
int k4Pin = 15;
//Methods
void walk_fwd() {
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 - 50 - m);
delay(0);
elbow2.write(e2 + 50 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 - 20 + m);
delay(0);
hip3.write(h3 + 20 - m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee3.write(k3 - 62 + m);
delay(0);
elbow2.write(e2 + 62 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 - m);
delay(0);
hip3.write(h3 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 - 38 - m);
delay(0);
elbow2.write(e2 + 38 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k4 + 50 + m);
delay(0);
elbow1.write(e1 - 50 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 + 20 - m);
delay(0);
hip4.write(h4 - 20 + m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee4.write(k4 + 62 - m);
delay(0);
elbow1.write(e1 - 62 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 + m);
delay(0);
hip4.write(h4 - m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k3 + 38 + m);
delay(0);
elbow1.write(e2 - 38 - m);
delay(15);
}
}
void walk_left() {
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 - 40 - m);
delay(0);
elbow2.write(e2 + 80 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 - 50 + m);
delay(0);
hip3.write(h3 + 10 - m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee3.write(k3 - 52 + m);
delay(0);
elbow2.write(e2 + 92 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 - m);
delay(0);
hip3.write(h3 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 - 28 - m);
delay(0);
elbow2.write(e2 + 68 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k4 + 80 + m);
delay(0);
elbow1.write(e1 - 40 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 + 10 - m);
delay(0);
hip4.write(h4 - 50 + m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee4.write(k4 + 92 - m);
delay(0);
elbow1.write(e1 - 52 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 + m);
delay(0);
hip4.write(h4 - m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k3 + 68 + m);
delay(0);
elbow1.write(e2 - 28 - m);
delay(15);
}
}
void walk_right() {
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 - 80 - m);
delay(0);
elbow2.write(e2 + 40 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 - 10 + m);
delay(0);
hip3.write(h3 + 50 - m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee3.write(k3 - 92 + m);
delay(0);
elbow2.write(e2 + 52 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 - m);
delay(0);
hip3.write(h3 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 - 68 - m);
delay(0);
elbow2.write(e2 + 28 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k4 + 40 + m);
delay(0);
elbow1.write(e1 - 80 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 + 50 - m);
delay(0);
hip4.write(h4 - 10 + m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee4.write(k4 + 52 - m);
delay(0);
elbow1.write(e1 - 92 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 + m);
delay(0);
hip4.write(h4 - m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k3 + 28 + m);
delay(0);
elbow1.write(e2 - 68 - m);
delay(15);
}
}
void walk_back() {
for (m = 0; m <= 12; m += 1) {
knee4.write(k3 - 48 - m);
delay(0);
elbow1.write(e2 + 48 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 - m);
delay(0);
hip4.write(h4 + m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee4.write(k4 - 72 + m);
delay(0);
elbow1.write(e1 + 72 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder1.write(s1 - 30 + m);
delay(0);
hip4.write(h4 + 30 - m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee4.write(k4 - 60 - m);
delay(0);
elbow1.write(e1 + 60 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 + 48 + m);
delay(0);
elbow2.write(e2 - 48 - m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 + m);
delay(0);
hip3.write(h3 - m);
delay(15);
}
for (m = 0; m <= 24; m += 1) {
knee3.write(k3 + 72 - m);
delay(0);
elbow2.write(e2 - 72 + m);
delay(15);
}
for (m = 0; m <= 30; m += 1) {
shoulder2.write(s2 + 30 - m);
delay(0);
hip3.write(h3 - 30 + m);
delay(15);
}
for (m = 0; m <= 12; m += 1) {
knee3.write(k3 + 60 + m);
delay(0);
elbow2.write(e2 - 60 - m);
delay(15);
}
}
void walk_stop() {
elbow2.write(e2 + 60);
delay(d5);
shoulder2.write(s2 - 30);
delay(d5);
knee4.write(k4 + 60);
delay(d5);
hip4.write(h4 - 30);
delay(d5);
elbow1.write(e1 - 60);
delay(d5);
shoulder1.write(s1 + 30);
delay(d5);
knee3.write(k3 - 60);
delay(d5);
hip3.write(h3 + 30);
delay(d6);
}
// WiFi Password
const char* ssid1 = "VinnieWiFi";
const char* password1 = "Qwerty123!";
// Receive data
typedef struct struct_message {
int b;
} struct_message;
struct_message myData;
// callback function that will be executed when data is received
void OnDataRecv(const uint8_t* mac, const uint8_t* incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.println("Data Recieved");
if (myData.b == 1) {
Serial.println("Forward");
while (myData.b == 1){
walk_fwd();}
}else if (myData.b == 2) {
Serial.println("Left");
while (myData.b == 2){
walk_left();}
} else if (myData.b == 3) {
Serial.println("Right");
while (myData.b == 3){
walk_right();}
} else if (myData.b == 4) {
Serial.println("Backward");
while (myData.b == 4){
walk_back();}
} else
Serial.println("Stop");
walk_stop();
}
void setup() {
Serial.begin(115200);
// Wi-Fi connection
WiFi.mode(WIFI_AP_STA);
WiFi.softAP(ssid1, password1, CHANNEL, 1);
IPAddress myIP = WiFi.softAPIP();
WiFi.begin(ssid1, password1);
Serial.println("Connected");
// Init ESP-NOW
esp_now_init();
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
esp_now_register_recv_cb(esp_now_recv_cb_t(OnDataRecv));
hip3.attach(h3Pin); //purple
hip3.write(h3);
delay(d1);
shoulder1.attach(s1Pin); //orange
shoulder1.write(s1);
delay(d1);
hip4.attach(h4Pin); //grey
hip4.write(h4);
delay(d1);
shoulder2.attach(s2Pin); //green
shoulder2.write(s2);
delay(d1);
knee3.attach(k3Pin); //black
knee3.write(k3);
delay(d1);
elbow1.attach(e1Pin); //yellow
elbow1.write(e1);
delay(d1);
knee4.attach(k4Pin); //white
knee4.write(k4);
delay(d1);
elbow2.attach(e2Pin); //blue
elbow2.write(e2);
delay(d5);
elbow2.write(e2 + 60);
delay(d5);
shoulder2.write(s2 - 30);
delay(d5);
knee4.write(k4 + 60);
delay(d5);
hip4.write(h4 - 30);
delay(d5);
elbow1.write(e1 - 60);
delay(d5);
shoulder1.write(s1 + 30);
delay(d5);
knee3.write(k3 - 60);
delay(d5);
hip3.write(h3 + 30);
delay(d5);
}
void loop() {
}
}
void loop() {
}
And here's what's in the Serial Monitor:
entry 0x400805f0
Setting AP (Access Point)…AP IP address: 192.168.4.1
Forward
Error sending the data
Stop
Error sending the data
Forward
Error sending the data
Stop
Error sending the data
Forward
Error sending the data
Stop
Error sending the data
Left
Error sending the data
Stop
Error sending the data
Any help is appeciated. I thought I posted this yesterday, but turns out the pain killers I took were WAY too strong, so I never actually finished typing this. If I did already post this, opps!