hello and goodevening its been 4 hours i've been trying to figure out why my arduino uno is not sending any data to my esp32 it only keep me showing this output
your UNO is 5V
your ESP32-CAM is 3.3V
when your UNO Tx is set to 5V, that's what get received on the Rx pin of the ESP32 and it possibly burns the pin because you are not supposed to send 5V but only 3.3....
please, please never ever again post pictures of text... Not only they are not readable nor usable directly for copy&paste but they use up lots of storage and internet bandwidth which contributes to polluting the planet.
➜ do your part and do yourself a favour and please read How to get the best out of this forum and modify your post accordingly (including code tags and necessary documentation for your ask).
Ah, I'm sorry, the UART I just set up has a voltage divider, and it must somehow send data, anyway."
Using D0 and D1 on the UNO removes the most natural debugging tool, Serial.print and Serial monitor. How do You intend to make debugging possible?
Why not use Software Serial and D2/D3 instead?
i just did i tried transfering the rx tx but still didnt work... is this code correct? #include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); /
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() {
mySerial.println("Hello Boss"); /
delay(1500);
this if for the arduino
and this is for my esp32
#define RXp2 2
#define TXp2 3
void setup() {
Serial.begin(9600);
Serial2.begin(9600, SERIAL_8N1, RXp2, TXp2);
}
void loop() {
if (Serial2.available()) {
char data = Serial2.read(); // Read data from SoftwareSerial
Serial.println("Message Received: " + String(data));
}
}
I'll check it when I get to the Pc.
Take a look at arduino.cc/reference/serial! Serial.read only returns one character, not an entire string. You need to use another serial. read function.
please show a bit of respect for the forum etiquette...
Edit your post using the in the tool bar just below your post
select the code part and press the <code/>
icon in the tool bar to mark it as code. (also make sure you indented the code in the IDE before copying, that’s done by pressing ctrlT on a PC or cmdT on a Mac)
➜ do yourself a favour and please read How to get the best out of this forum
alright thanks man im really new to to the arduino,
please edit and fix your post (add code tags)
This is a tested tutorial. Here, UNO (the Transmitter) receives a number (n) from the InputBox of the Serial Monitor, sends it to CAM Module using Software UART Port (SUART), CAM recives the number via its UART0 Port and blinks the onboard LED (with GPIO-33) for n times at 1-sec interval.
1. Uplaod the following sketch into ESP32-CAM Module (the receiver) using ESP32-CAM-MB adapter (Fig-1).
#define LED 33
char myData[10];
void setup()
{
Serial.begin(9600);
pinMode(LED, OUTPUT);
}
void loop()
{
byte n = Serial.available();
if (n != 0)
{
byte m = Serial.readBytesUntil('\n', myData, sizeof(myData) - 1);
myData[m] = '\0'; //null-character
int k = atoi(myData);
for(int i = 0; i < k; i++)
{
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}
}
}
Figure-1:
2. Disconnect the CAM Module from the adapter board.
3. Uplaod the following sketch into UNO (the transmitter).
#include<SoftwareSerial.h>
SoftwareSerial SUART(4, 5); //SRX = 4, STX = 5
char myData[10];
void setup()
{
Serial.begin(9600);
SUART.begin(9600);
}
void loop()
{
byte n = Serial.available();
if (n != 0)
{
byte m = Serial.readBytesUntil('\n', myData, sizeof(myData) - 1);
myData[m] = '\0'; //null-character
int y = atoi(myData);
SUART.print(y, DEC);
SUART.print('\n');
delay(2000);
}
}
4. Build the following setup (Fig-2):
Figure-2:
5. Press RESET Button on both UNO and CAM.
6. Open Serial Monitor of UNO at Bd = 9600 with Newline option.
7. Enter 3 in the InputBox of the Serial Monitor and then click on the Send Button.
8. Check that Red LED (at the backside) of CAM Module blinks for three times at 1-sec interval.
9. Once blinking is finishied, send another number (say 7) from Serial Monitor of UNO. Check that Red LED of CAM blinks for seven times.
it works yay thanks man now i know how to send data
now im trying to figure out how to integrate this code to the another code i have, in EasyVr Shield 3.0
Can you add codes with the sketch of post #11 to receive data from CAM by UNO?
im current make your FIG-2 as my primary pathway to send data since its working now, and now i just want to make my easyvrshield 3.0 UNO send data to esp32 webstreaming server when ever it detects a triggering words this is the code of my easyvr
EasyVR Tester
Dump contents of attached EasyVR module
and exercise it with playback and recognition.
Serial monitor can be used to send a few basic commands:
'?' - display the module setup
'l' - cycles through available languages
'c' - cycles through available command groups
'b' - cycles through built-in word sets
'g' - cycles through custom grammars
's123' - play back sound 123 if available (or beep)
'd0123456789ABCD*#' - dials the specified number ('_' is dial tone)
'k' - starts detection of tokens
'4' or '8' - sets token length to 4 or 8 bits
'n123' - play back token 123 (not checked for validity)
'm1' - set mic distance to HEADSET
'm2' - set mic distance to ARMS_LENGTH (default)
'm3' - set mic distance to FAR_MIC
'w' - enter sleep mode without audio wakeup (any command interrupts)
'ww' - enter sleep mode with "whistle" wakeup
'w2' - enter sleep mode with "double-clap" wakeup
'w3' - enter sleep mode with "triple-clap" wakeup
'wl' - enter sleep mode with "loud-sound" wakeup
'r12' - record message 12 if empty
'p12' - play back message 12 if recorded
'e12' - erase message 12
With EasyVR Shield, the green LED is ON while the module
is listening (using pin IO1 of EasyVR).
Successful recognition is acknowledged with a beep.
Details are displayed on the serial monitor window.
**
Example code for the EasyVR library v1.10.1
Written in 2017 by RoboTech srl for VeeaR <http:://www.veear.eu>
To the extent possible under law, the author(s) have dedicated all
copyright and related and neighboring rights to this software to the
public domain worldwide. This software is distributed without any warranty.
You should have received a copy of the CC0 Public Domain Dedication
along with this software.
If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include "Arduino.h"
#if !defined(SERIAL_PORT_MONITOR)
#error "Arduino version not supported. Please update your IDE to the latest version."
#endif
#if defined(__SAMD21G18A__)
// Shield Jumper on HW (for Zero, use Programming Port)
#define port SERIAL_PORT_HARDWARE
#define pcSerial SERIAL_PORT_MONITOR
#elif defined(SERIAL_PORT_USBVIRTUAL)
// Shield Jumper on HW (for Leonardo and Due, use Native Port)
#define port SERIAL_PORT_HARDWARE
#define pcSerial SERIAL_PORT_USBVIRTUAL
#else
// Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX)
#include "SoftwareSerial.h"
SoftwareSerial port(12, 13);
#define pcSerial SERIAL_PORT_MONITOR
#endif
#include "EasyVR.h"
EasyVR easyvr(port);
int8_t bits = 4;
int8_t set = 0;
int8_t group = 0;
uint32_t mask = 0;
uint8_t train = 0;
int8_t grammars = 0;
int8_t lang = 0;
char name[33];
bool useCommands = true;
bool useGrammars = false;
bool useTokens = false;
bool isSleeping = false;
bool isBusy = false;
void setup()
{
// setup PC serial port
pcSerial.begin(9600);
bridge:
// bridge mode?
int mode = easyvr.bridgeRequested(pcSerial);
switch (mode)
{
case EasyVR::BRIDGE_NONE:
// setup EasyVR serial port
port.begin(9600);
// run normally
pcSerial.println(F("Bridge not requested, run normally"));
pcSerial.println(F("---"));
break;
case EasyVR::BRIDGE_NORMAL:
// setup EasyVR serial port (low speed)
port.begin(9600);
// soft-connect the two serial ports (PC and EasyVR)
easyvr.bridgeLoop(pcSerial);
// resume normally if aborted
pcSerial.println(F("Bridge connection aborted"));
pcSerial.println(F("---"));
break;
case EasyVR::BRIDGE_BOOT:
// setup EasyVR serial port (high speed)
port.begin(115200);
pcSerial.end();
pcSerial.begin(115200);
// soft-connect the two serial ports (PC and EasyVR)
easyvr.bridgeLoop(pcSerial);
// resume normally if aborted
pcSerial.println(F("Bridge connection aborted"));
pcSerial.println(F("---"));
break;
}
// initialize EasyVR
while (!easyvr.detect())
{
pcSerial.println(F("EasyVR not detected!"));
for (int i = 0; i < 10; ++i)
{
if (pcSerial.read() == EasyVR::BRIDGE_ESCAPE_CHAR)
goto bridge;
delay(100);
}
}
pcSerial.print(F("EasyVR detected, version "));
pcSerial.print(easyvr.getID());
if (easyvr.getID() < EasyVR::EASYVR3)
easyvr.setPinOutput(EasyVR::IO1, LOW); // Shield 2.0 LED off
if (easyvr.getID() < EasyVR::EASYVR)
pcSerial.print(F(" = VRbot module"));
else if (easyvr.getID() < EasyVR::EASYVR2)
pcSerial.print(F(" = EasyVR module"));
else if (easyvr.getID() < EasyVR::EASYVR3)
pcSerial.print(F(" = EasyVR 2 module"));
else
pcSerial.print(F(" = EasyVR 3 module"));
pcSerial.print(F(", FW Rev."));
pcSerial.println(easyvr.getID() & 7);
easyvr.setDelay(0); // speed-up replies
if (easyvr.getID() >= EasyVR::EASYVR3_1)
{
if (!easyvr.checkMessages() && easyvr.getError() == EasyVR::ERR_CUSTOM_INVALID)
{
pcSerial.print(F("Message recovery needed, please wait..."));
if (easyvr.fixMessages())
pcSerial.println(F(" done!"));
else
pcSerial.println(F(" failed!"));
}
}
pcSerial.print(F("Recorded messages:"));
if (easyvr.getID() >= EasyVR::EASYVR3_1)
{
pcSerial.println();
for (int8_t idx = 0; idx < 32; ++idx)
{
int8_t bits = -1; int32_t len = -1;
easyvr.dumpMessage(idx, bits, len);
if ((bits == 0) && (len == 0))
continue; // skip empty
pcSerial.print(idx);
pcSerial.print(F(" = "));
if (bits < 0 || len < 0)
pcSerial.println(F(" has errors"));
else
{
pcSerial.print(bits);
pcSerial.print(F(" bits, size "));
pcSerial.println(len);
}
}
}
else
pcSerial.println(F("n/a"));
easyvr.setTimeout(5);
lang = EasyVR::ENGLISH;
easyvr.setLanguage(lang);
// use fast recognition
easyvr.setTrailingSilence(EasyVR::TRAILING_MIN);
easyvr.setCommandLatency(EasyVR::MODE_FAST);
int16_t count = 0;
pcSerial.print(F("Sound table: "));
if (easyvr.dumpSoundTable(name, count))
{
pcSerial.println(name);
pcSerial.print(F("Sound entries: "));
pcSerial.println(count);
}
else
pcSerial.println(F("n/a"));
pcSerial.print(F("Custom Grammars: "));
grammars = easyvr.getGrammarsCount();
if (grammars > 4)
{
pcSerial.println(grammars - 4);
for (set = 4; set < grammars; ++set)
{
pcSerial.print(F("Grammar "));
pcSerial.print(set);
uint8_t flags, num;
if (easyvr.dumpGrammar(set, flags, num))
{
pcSerial.print(F(" has "));
pcSerial.print(num);
if (flags & EasyVR::GF_TRIGGER)
pcSerial.println(F(" trigger"));
else
pcSerial.println(F(" command(s)"));
}
else
{
pcSerial.println(F(" error"));
continue;
}
for (int8_t idx = 0; idx < num; ++idx)
{
pcSerial.print(idx);
pcSerial.print(F(" = "));
if (!easyvr.getNextWordLabel(name))
break;
pcSerial.println(name);
}
}
}
else
pcSerial.println(F("n/a"));
if (easyvr.getGroupMask(mask))
{
uint32_t msk = mask;
for (group = 0; group <= EasyVR::PASSWORD; ++group, msk >>= 1)
{
if (!(msk & 1)) continue;
if (group == EasyVR::TRIGGER)
pcSerial.print(F("Trigger: "));
else if (group == EasyVR::PASSWORD)
pcSerial.print(F("Password: "));
else
{
pcSerial.print(F("Group "));
pcSerial.print(group);
pcSerial.print(F(" has "));
}
count = easyvr.getCommandCount(group);
pcSerial.print(count);
if (group == 0)
pcSerial.println(F(" trigger(s)"));
else
pcSerial.println(F(" command(s)"));
for (int8_t idx = 0; idx < count; ++idx)
{
if (easyvr.dumpCommand(group, idx, name, train))
{
pcSerial.print(idx);
pcSerial.print(F(" = "));
pcSerial.print(name);
pcSerial.print(F(", Trained "));
pcSerial.print(train, DEC);
if (!easyvr.isConflict())
pcSerial.println(F(" times, OK"));
else
{
int8_t confl = easyvr.getWord();
if (confl >= 0)
pcSerial.print(F(" times, Similar to Word "));
else
{
confl = easyvr.getCommand();
pcSerial.print(F(" times, Similar to Command "));
}
pcSerial.println(confl);
}
}
}
}
}
group = 0;
set = 0;
mask |= 1; // force to use trigger (mixed SI/SD)
useCommands = (mask != 0);
isSleeping = false;
pcSerial.println(F("---"));
}
const char* ws0[] =
{
"ROBOT",
};
const char* ws1[] =
{
"DOGPANT"
"DOGPANT2"
};
const char* ws2[] =
{
"LEFT",
"RIGHT",
"UP",
"DOWN",
"FORWARD",
"BACKWARD",
};
const char* ws3[] =
{
"ZERO",
"ONE",
"TWO",
"THREE",
"FOUR",
"FIVE",
"SIX",
"SEVEN",
"EIGHT",
"NINE",
"TEN",
};
const char** ws[] = { ws0, ws1, ws2, ws3 };
int readNum()
{
int rx;
int num = 0;
delay(5);
while ((rx = pcSerial.read()) >= 0)
{
delay(5);
if (isdigit(rx))
num = num * 10 + (rx - '0');
else
break;
}
return num;
}
bool checkMonitorInput()
{
if (pcSerial.available() <= 0)
return false;
// check console commands
int16_t rx = pcSerial.read();
if (rx == EasyVR::BRIDGE_ESCAPE_CHAR)
{
setup();
return true;
}
if (isSleeping)
{
// any character received will exit sleep
isSleeping = false;
easyvr.stop();
pcSerial.println(F("Forced wake-up!"));
return true;
}
if (rx == 'l')
{
easyvr.stop();
lang++;
if (easyvr.setLanguage(lang) || easyvr.setLanguage(lang = 0))
{
pcSerial.print(F("Language set to "));
pcSerial.println(lang);
}
else
pcSerial.println(F("Error while setting language!"));
}
if (rx == 'b')
{
useTokens = false;
useCommands = false;
useGrammars = true;
set++;
if (set > 3)
set = 0;
}
if (rx == 'g' && grammars > 4)
{
useTokens = false;
useCommands = false;
useGrammars = true;
set++;
if (set >= grammars)
set = 4;
}
if (rx == 'c')
{
useTokens = false;
useCommands = true;
useGrammars = false;
do
{
group++;
if (group > EasyVR::PASSWORD)
group = 0;
}
while (!((mask >> group) & 1));
}
if (rx == 'k')
{
useTokens = true;
useCommands = false;
useGrammars = false;
}
if (rx == '4')
{
bits = 4;
}
if (rx == '8')
{
bits = 8;
}
if (rx == 'n')
{
int16_t num = readNum();
pcSerial.print(F("Play token "));
pcSerial.println(num);
easyvr.stop();
easyvr.sendToken(bits, num);
}
if (rx == 's')
{
int16_t num = 0;
delay(5);
while ((rx = pcSerial.read()) >= 0)
{
delay(5);
if (isdigit(rx))
num = num * 10 + (rx - '0');
else
break;
}
pcSerial.print(F("Play sound "));
pcSerial.println(num);
easyvr.stop();
easyvr.playSound(num, EasyVR::VOL_DOUBLE);
}
if (rx == 'd')
{
easyvr.stop();
pcSerial.println(F("Play tones:"));
int16_t num = 0;
delay(5);
while ((rx = pcSerial.read()) >= 0)
{
delay(5);
if (isdigit(rx))
num = rx - '0';
else if (rx == '*')
num = 10;
else if (rx == '#')
num = 11;
else if (rx >= 'A' && rx <= 'D')
num = rx - 'A';
else if (rx == '_')
num = -1;
else
break;
pcSerial.print(num);
if (easyvr.playPhoneTone(num, 3))
pcSerial.println(F(" OK"));
else
pcSerial.println(F(" ERR"));
}
}
if (rx == 'm')
{
int16_t num = readNum();
pcSerial.print(F("Mic distance "));
pcSerial.println(num);
easyvr.stop();
easyvr.setMicDistance(num);
}
if (rx == 'w')
{
int8_t mode = 0;
delay(5);
while ((rx = pcSerial.read()) >= 0)
{
delay(5);
if (rx == 'w')
mode = EasyVR::WAKE_ON_WHISTLE;
if (rx == '2')
mode = EasyVR::WAKE_ON_2CLAPS;
if (rx == '3')
mode = EasyVR::WAKE_ON_3CLAPS;
if (rx == 'l')
mode = EasyVR::WAKE_ON_LOUDSOUND;
}
pcSerial.print(F("Sleep mode "));
pcSerial.println(mode);
easyvr.stop();
if (easyvr.getID() < EasyVR::EASYVR3)
easyvr.setPinOutput(EasyVR::IO1, LOW); // Shield 2.0 LED off
isSleeping = easyvr.sleep(mode);
return true;
}
if (rx == 'r')
{
int8_t num = readNum();
pcSerial.print(F("Record (5 seconds) message "));
pcSerial.println(num);
easyvr.stop();
easyvr.recordMessageAsync(num, 8, 5);
useTokens = false;
useCommands = false;
useGrammars = false;
isBusy = true;
return true;
}
if (rx == 'p')
{
int8_t num = readNum();
pcSerial.print(F("Play message "));
pcSerial.println(num);
easyvr.stop();
easyvr.playMessageAsync(num, EasyVR::SPEED_NORMAL, EasyVR::ATTEN_NONE);
useTokens = false;
useCommands = false;
useGrammars = false;
isBusy = true;
return true;
}
if (rx == 'e')
{
int8_t num = readNum();
pcSerial.print(F("Erase message "));
pcSerial.println(num);
easyvr.stop();
easyvr.eraseMessageAsync(num);
useTokens = false;
useCommands = false;
useGrammars = false;
isBusy = true;
return true;
}
if (rx >= 0)
{
easyvr.stop();
pcSerial.flush();
return true;
}
return false;
}
void loop()
{
checkMonitorInput();
if (!isSleeping && !isBusy)
{
if (easyvr.getID() < EasyVR::EASYVR3)
easyvr.setPinOutput(EasyVR::IO1, HIGH); // Shield 2.0 LED on (listening)
if (useTokens)
{
pcSerial.print(F("Detect a "));
pcSerial.print(bits);
pcSerial.println(F(" bit token ..."));
easyvr.detectToken(bits, EasyVR::REJECTION_AVG, 0);
}
else if (useCommands)
{
pcSerial.print(F("Say a command in Group "));
pcSerial.println(group);
easyvr.recognizeCommand(group);
}
else if (useGrammars)
{
pcSerial.print(F("Say a word in Wordset "));
pcSerial.println(set);
easyvr.recognizeWord(set);
}
}
do
{
if (checkMonitorInput())
return;
}
while (!easyvr.hasFinished());
isSleeping = false;
isBusy = false;
if (easyvr.getID() < EasyVR::EASYVR3)
easyvr.setPinOutput(EasyVR::IO1, LOW); // Shield 2.0 LED off
if (easyvr.isAwakened())
{
pcSerial.println(F("Audio wake-up!"));
return;
}
int16_t idx;
if (useTokens)
{
idx = easyvr.getToken();
if (idx >= 0)
{
pcSerial.print(F("Token: "));
pcSerial.println(idx);
easyvr.playSound(0, EasyVR::VOL_FULL);
}
}
// handle voice recognition
idx = easyvr.getWord();
if (idx >= 0)
{
pcSerial.print(F("Word: "));
pcSerial.print(easyvr.getWord());
pcSerial.print(F(" = "));
if (useCommands)
pcSerial.println(ws[group][idx]);
// --- optional: builtin words can be retrieved from the module
else if (set < 4)
pcSerial.println(ws[set][idx]);
// ---
else
{
uint8_t flags, num;
if (easyvr.dumpGrammar(set, flags, num))
while (idx-- >= 0)
{
if (!easyvr.getNextWordLabel(name))
break;
}
if (idx < 0)
pcSerial.println(name);
else
pcSerial.println();
}
// ok, let's try another set
if (set < 4)
{
set++;
if (set > 3)
set = 0;
}
else
{
set++;
if (set >= grammars)
set = 4;
}
easyvr.playSound(0, EasyVR::VOL_FULL);
}
else
{
idx = easyvr.getCommand();
if (idx >= 0)
{
pcSerial.print(F("Command: "));
pcSerial.print(easyvr.getCommand());
if (easyvr.dumpCommand(group, idx, name, train))
{
pcSerial.print(F(" = "));
pcSerial.println(name);
}
else
pcSerial.println();
// ok, let's try another group
do
{
group++;
if (group > EasyVR::PASSWORD)
group = 0;
}
while (!((mask >> group) & 1));
easyvr.playSound(0, EasyVR::VOL_FULL);
}
else // errors or timeout
{
int16_t err = easyvr.getError();
if (err >= 0)
{
pcSerial.print(F("Error 0x"));
pcSerial.println(err, HEX);
}
else if (easyvr.isTimeout())
pcSerial.println(F("Timed out."));
else
pcSerial.println(F("Done."));
}
}
}
and this is the code of my esp32
#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#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
#define LIGHT_PIN 4
const int PWMLightChannel = 4;
// Camera-related constants
camera_config_t config;
const char* ssid = "LLLLLLLLLLLLLL";
const char* password = "59615330";
IPAddress staticIP(192, 168, 1, 150);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);
AsyncWebServer server(80);
AsyncWebSocket wsCamera("/Camera");
uint32_t cameraClientId = 0;
const char* htmlHomePage PROGMEM = R"HTMLHOMEPAGE(
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<style>
.noselect {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.slidecontainer {
width: 100%;
}
.slider {
-webkit-appearance: none;
width: 100%;
height: 20px;
border-radius: 5px;
background: #d3d3d3;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
}
.slider:hover {
opacity: 1;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 40px;
height: 40px;
border-radius: 50%;
background: red;
cursor: pointer;
}
.slider::-moz-range-thumb {
width: 40px;
height: 40px;
border-radius: 50%;
background: red;
cursor: pointer;
}
</style>
</head>
<body class="noselect" align="center" style="background-color:white">
<table id="mainTable" style="width:400px;margin:auto;table-layout:fixed" CELLSPACING=10>
<tr>
<img id="cameraImage" src="" style="width:400px;height:250px"></td>
</tr>
<tr /><tr />
<tr>
<td style="text-align:left"><b>Light:</b></td>
<td colspan=2>
<div class="slidecontainer">
<input type="range" min="0" max="255" value="0" class="slider" id="Light" oninput='sendButtonInput("Light", value)'>
</div>
</td>
</tr>
</table>
<script>
var webSocketCameraUrl = "ws:\/\/" + window.location.hostname + "/Camera";
var webSocketServoInputUrl = "ws:\/\/" + window.location.hostname + "/ServoInput";
var websocketCamera;
var websocketServoInput;
function initCameraWebSocket() {
websocketCamera = new WebSocket(webSocketCameraUrl);
websocketCamera.binaryType = 'blob';
websocketCamera.onopen = function (event) {};
websocketCamera.onclose = function (event) { setTimeout(initCameraWebSocket, 2000); };
websocketCamera.onmessage = function (event) {
var imageId = document.getElementById("cameraImage");
imageId.src = URL.createObjectURL(event.data);
};
}
function initServoInputWebSocket() {
websocketServoInput = new WebSocket(webSocketServoInputUrl);
websocketServoInput.onopen = function (event) {
var lightButton = document.getElementById("Light");
sendButtonInput("Light", lightButton.value);
};
websocketServoInput.onclose = function (event) { setTimeout(initServoInputWebSocket, 2000); };
websocketServoInput.onmessage = function (event) {};
}
function initWebSocket() {
initCameraWebSocket();
initServoInputWebSocket();
}
function sendButtonInput(key, value) {
var data = key + "," + value;
websocketServoInput.send(data);
}
window.onload = initWebSocket;
document.getElementById("mainTable").addEventListener("touchend", function (event) {
event.preventDefault()
});
</script>
</body>
</html>
)HTMLHOMEPAGE";
void handleRoot(AsyncWebServerRequest *request)
{
request->send_P(200, "text/html", htmlHomePage);
}
void handleNotFound(AsyncWebServerRequest *request)
{
request->send(404, "text/plain", "File Not Found");
}
void onCameraWebSocketEvent(AsyncWebSocket *server,
AsyncWebSocketClient *client,
AwsEventType type,
void *arg,
uint8_t *data,
size_t len)
{
switch (type)
{
case WS_EVT_CONNECT:
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
cameraClientId = client->id();
break;
case WS_EVT_DISCONNECT:
Serial.printf("WebSocket client #%u disconnected\n", client->id());
cameraClientId = 0;
break;
case WS_EVT_DATA:
break;
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
default:
break;
}
}
void setupCamera()
{
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;
config.frame_size = FRAMESIZE_HD;
config.jpeg_quality = 15;
config.fb_count = 1;
// Camera initialization
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
}
void sendCameraPicture()
{
if (cameraClientId == 0)
{
return;
}
unsigned long startTime1 = millis();
// Capture a frame
camera_fb_t *fb = esp_camera_fb_get();
if (!fb)
{
Serial.println("Frame buffer could not be acquired");
return;
}
unsigned long startTime2 = millis();
wsCamera.binary(cameraClientId, fb->buf, fb->len);
esp_camera_fb_return(fb);
// Wait for the message to be delivered
while (true)
{
AsyncWebSocketClient *clientPointer = wsCamera.client(cameraClientId);
if (!clientPointer || !(clientPointer->queueIsFull()))
{
break;
}
}
unsigned long startTime3 = millis();
Serial.printf("Time taken Total: %d|%d|%d\n", startTime3 - startTime1, startTime2 - startTime1, startTime3 - startTime2);
}
void setup(void)
{
Serial.begin(115200);
if (WiFi.config(staticIP, gateway, subnet) == false) {
Serial.println("Configuration failed.");
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("Connecting...\n\n");
}
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
Serial.print("Subnet Mask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway IP: ");
Serial.println(WiFi.gatewayIP());
server.on("/", HTTP_GET, handleRoot);
server.onNotFound(handleNotFound);
wsCamera.onEvent(onCameraWebSocketEvent);
server.addHandler(&wsCamera);
server.begin();
Serial.println("HTTP server started");
setupCamera();
}
void loop()
{
wsCamera.cleanupClients();
sendCameraPicture();
}
both of them are working rn but the only thing i need is for esp32 to recieve data from arduino shield. and this is my current setup
good luck for your project. I'm out of here since you did not fix the earlier posts.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.