Juraj:
try to reference the WiFiData object, not copy itvoid process(WifiData& client) {Edit: I see that in the example it is not passed as reference.
the UnoWiFiDevEd is strange. I changed the firmware to WiFi Link
Hi Juraj! Thanks for this tip. Will look into this.
I got another concern. Data are sending very slowly. How do I speed up the transmission from Client to Server? Here is my updated and working code while waiting for your reply:
Client Side:
#include <Wire.h>
#include <UnoWiFiDevEd.h>
#define CONNECTOR "rest"
#define SERVER_ADDR "192.168.1.102"
String command;
int xaxis, yaxis;
void setup() {
Ciao.begin();
Ciao.write(CONNECTOR, SERVER_ADDR, "/arduino/digital/0");
}
void loop() {
xaxis = map(analogRead(A0), 0, 1000, -1, 1);
yaxis = map(analogRead(A1), 0, 1000, -1, 1);
flex = map(analogRead(A2), 0, 1000, -1, 1);
if (xaxis == -1) {
Ciao.write(CONNECTOR, SERVER_ADDR, "/arduino/digital/1");
}
else if (xaxis == 1) {
Ciao.write(CONNECTOR, SERVER_ADDR, "/arduino/digital/2");
}
else if (yaxis == -1) {
Ciao.write(CONNECTOR, SERVER_ADDR, "/arduino/digital/3");
}
else if (yaxis == 1) {
Ciao.write(CONNECTOR, SERVER_ADDR, "/arduino/digital/4");
}
else{
Ciao.write(CONNECTOR, SERVER_ADDR, "/arduino/digital/0");
}
}
Server Side:
#include <Wire.h>
#include <UnoWiFiDevEd.h>
String command;
void setup(){
Serial.begin(9600);
Wifi.begin();
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop(){
while(Wifi.available()){
process(Wifi);
}
}
void process(WifiData client) {
command = client.readStringUntil('/');
if (command == "mode") {
modeCommand(client);
Serial.println(command);
}
if (command == "digital") {
digitalCommand(client);
Serial.println(command);
}
if (command == "analog") {
analogCommand(client);
Serial.println(command);
}
}
void modeCommand(WifiData client) {
int pin;
pin = client.parseInt();
if (client.read() != '/') {
client.print(EOL);
Serial.println(command);
}
String mode = client.readStringUntil('\r');
if (mode == "input") {
pinMode(pin, INPUT);
client.print(EOL);
Serial.println(command);
return;
}
if (mode == "output") {
pinMode(pin, OUTPUT);
client.print(EOL);
Serial.println(command);
}
client.print(EOL);
Serial.print(command), Serial.print("\n");
}
void digitalCommand(WifiData client) {
int value;
value = client.parseInt();
if (value == 1){
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
}
else if (value == 2){
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else if (value == 3){
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
else if (value == 4){
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else if (value == 0){
digitalWrite(9, LOW);
digitalWrite(10, LOW);
}
client.print(EOL);
Serial.println(value);
}
void analogCommand(WifiData client) {
int pin, value;
pin = client.parseInt();
if (client.read() == '/') {
value = client.parseInt();
analogWrite(pin, value);
client.print(EOL);
Serial.println(command);
}
else {
value = analogRead(pin);
client.print(EOL);
Serial.println(command);
}
}
Apparently, the code works with fixed naming conventions (e.g. /arduino/analog, /arduino/digital, /arduino/mode) must remain as is and these three functions (e.g. analogCommand(), digitalCommand()
and modeCommand()) remain present throughout the code on the Server Side. And, yes; I agree that the current set-up for UnoWifiDevEd is weird.
Hopefully you can help me speed up the transmission! Thanks a lot!