Hallo, probleem met Ethernetshield en LCD opArd. Uno.

Arduino specifieke Software
Berichten: 6
Geregistreerd: 04 Nov 2018, 11:11
Woonplaats: Delfzijl

Hallo, probleem met Ethernetshield en LCD opArd. Uno.

Berichtdoor HarvdLaan » 07 Nov 2018, 13:51

Ik worstel al een tijd met een communicatie probleem.
Verder in het project plaats ik 2 DHT22,s maar ik ga hier eerst verder terug naar de basis.
Dit is een kant en klaar sketch van Statco tbv het webshield gebruik voor aansturing van de digitale pins en uitlezing van de analoge waarden.
Ik gebruik Sketch versie V4 , welke bij de "Ethernet kit Pro " hoort.
Ik ben ook al een tijdje in kontakt met de maker Rabee in communicatie. Bij hem draait het probleemloos en bij mij niet.

de digitale uitlezing van d7 en d8 zijn voor de DHT22,s waarvan ik de waarden terug wil zien in de LCD strings.

Stap 1 :
Ik krijg de Arduino niet online wanneer ik de "#define lcdSize 5 " gebruik.
( 4 maakt hem onstabiel )
Terugzetten naar 3 en hup daar draait ie weer ok !

Code :
/*
Done By TATCO Inc.
Serial.begin from 115200 to 9600

Contact:
info@tatco.cc

Release Notes:
- Created 10 Oct 2015
- V2 Updated 04 Nov 2016
- V3 Updated 05 Oct 2017
- V4 Updated 07 Oct 2018

Note:
1- This sketch compatable with Eathernet shield and Wiznet W5100
2- Tested with Mega, Uno, Leo
3- Uno & Leo pins# 10, 11, 12, 13 used for ethernet shield
4- Mega Pins# 10, 50, 51, 52, 53 used for ethernet shield

*/

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>



#define lcdSize 5
//this will define number of LCD on the phone app

String protectionPassword = "Harry"; //This will not allow anyone to add or control your board.
String boardType;

// VCC: 5V or 3V
// GND: GND
// SENSOR 1 is in Digital Data pin: 7
// SENSOR 1 is in Digital Data pin: 8

int dataPinSensor1 = 7;
int dataPinSensor2 = 8;
// SimpleDHT22 dht22;


byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192, 168, 178, 248); //Uncomment for fixed IP
EthernetServer server(80);
EthernetClient client;

char pinsMode[54];
int pinsValue[54];
Servo servoArray[53];

String lcd[lcdSize];
String httpAppJsonOk = "HTTP/1.1 200 OK\r\n content-type:application/json \r\n\r\n";
unsigned long serialTimer = millis();


void setup(void)
{

Serial.begin(9600);
Serial.println(F("Please wait for IP... "));
// Ethernet.begin( mac,ip);// Uncomment for fixed IP
Ethernet.begin(mac); // Comment for fixed IP
server.begin();
Serial.println(Ethernet.localIP());
boardInit();
}

void loop(void)
{

lcd[0] = "Test1LCD";// you can send any data to your mobile phone.
lcd[1] = "Test2LCD";// you can send any data to your mobile phone.
lcd[2] = analogRead(1);// send analog value of A1
lcd[3] = "TestLCD3";// you can send any data to your mobile phone.
lcd[4] = "test4";

EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
process(client);
delay(100);
client.flush();
client.stop();
}
}
}

serialPrintIpAddress();
update_input();
}

void process(EthernetClient client) {
String getString = client.readStringUntil('/');
String arduinoString = client.readStringUntil('/');
String command = client.readStringUntil('/');

if (command == "digital") {
digitalCommand(client);
}

if (command == "pwm") {
pwmCommand(client);
}

if (command == "servo") {
servoCommand(client);
}

if (command == "terminal") {
terminalCommand(client);
}

if (command == "mode") {
modeCommand(client);
}

if (command == "allonoff") {
allonoff(client);
}

if (command == "password") {
changePassword(client);
}

if (command == "allstatus") {
allstatus(client);
}

}

void changePassword(EthernetClient client) {
String data = client.readStringUntil('/');
protectionPassword = data;
client.print(httpAppJsonOk);
}

void terminalCommand(EthernetClient client) {//Here you recieve data form app terminal
String data = client.readStringUntil('/');
client.print(httpAppJsonOk + "Ok from Arduino " + String(random(1, 100)));
Serial.println(data);
}

void digitalCommand(EthernetClient client) {
int pin, value;
pin = client.parseInt();
if (client.read() == '/') {
value = client.parseInt();
digitalWrite(pin, value);
pinsValue[pin] = value;
client.print(httpAppJsonOk + value);
}
}

void pwmCommand(EthernetClient client) {
int pin, value;
pin = client.parseInt();
if (client.read() == '/') {
value = client.parseInt();
analogWrite(pin, value);
pinsValue[pin] = value;
client.print(httpAppJsonOk + value);
}
}

void servoCommand(EthernetClient client) {
int pin, value;
pin = client.parseInt();
if (client.read() == '/') {
value = client.parseInt();
servoArray[pin].write(value);
pinsValue[pin] = value;
client.print(httpAppJsonOk + value);
}
}

void modeCommand(EthernetClient client) {
String pinString = client.readStringUntil('/');
int pin = pinString.toInt();
String mode = client.readStringUntil('/');
if (mode != "servo") {
servoArray[pin].detach();
};

if (mode == "output") {
pinMode(pin, OUTPUT);
digitalWrite(pin, 0);
pinsMode[pin] = 'o';
pinsValue[pin] = 0;
allstatus(client);
}
if (mode == "push") {
pinsMode[pin] = 'm';
pinsValue[pin] = 0;
pinMode(pin, OUTPUT);
digitalWrite(pin, 0);
allstatus(client);
}
if (mode == "schedule") {
pinsMode[pin] = 'c';
pinsValue[pin] = 0;
pinMode(pin, OUTPUT);
digitalWrite(pin, 0);
allstatus(client);
}

if (mode == "input") {
pinsMode[pin] = 'i';
pinsValue[pin] = 0;
pinMode(pin, INPUT);
allstatus(client);
}

if (mode == "pwm") {
pinsMode[pin] = 'p';
pinsValue[pin] = 0;
pinMode(pin, OUTPUT);
analogWrite(pin, 0);
allstatus(client);
}

if (mode == "servo") {
pinsMode[pin] = 's';
pinsValue[pin] = 0;
servoArray[pin].attach(pin);
servoArray[pin].write(0);
allstatus(client);
}
}

void allonoff(EthernetClient client) {
int value = client.parseInt();
client.print(httpAppJsonOk);

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
for (byte i = 0; i <= 53; i++) {
if (pinsMode[i] == 'o') {
digitalWrite(i, value);
pinsValue[i] = value;
}
}
#endif

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)
for (byte i = 0; i <= 13; i++) {
if (pinsMode[i] == 'o') {
digitalWrite(i, value);
pinsValue[i] = value;
}
}
#endif

}

void allstatus(EthernetClient client) {
int digitalArraySize, analogArraySize;
if (boardType == "mega") {
digitalArraySize = 53;
analogArraySize = 15;
} else {
digitalArraySize = 13;
analogArraySize = 5;
}
String dataResponse;
dataResponse += F("HTTP/1.1 200 OK \r\n");
dataResponse += F("content-type:application/json \r\n\r\n");
dataResponse += "{";

dataResponse += "\"m\":[";//m for mode
for (byte i = 0; i <= digitalArraySize; i++) {
dataResponse += "\"";
dataResponse += pinsMode[i];
dataResponse += "\"";
if (i != digitalArraySize)dataResponse += ",";
}
dataResponse += "],";

dataResponse += "\"v\":[";//v for value
for (byte i = 0; i <= digitalArraySize; i++) {
dataResponse += pinsValue[i];
if (i != digitalArraySize)dataResponse += ",";
}
dataResponse += "],";

dataResponse += "\"a\":[";//a for analog value
for (byte i = 0; i <= analogArraySize; i++) {
dataResponse += analogRead(i);
if (i != analogArraySize)dataResponse += ",";
}
dataResponse += "],";

dataResponse += "\"l\":[";//l for LCD value
for (byte i = 0; i <= lcdSize - 1; i++) {
dataResponse += "\"";
dataResponse += lcd[i];
dataResponse += "\"";
if (i != lcdSize - 1)dataResponse += ",";
}
dataResponse += "],";
dataResponse += "\"t\":\""; //t for Board Type .
dataResponse += boardType;
dataResponse += "\",";
dataResponse += "\"p\":\""; // p for Password.
dataResponse += protectionPassword;
dataResponse += "\"";
dataResponse += "}";
client.print(dataResponse);
}

void serialPrintIpAddress() {
if (Serial.read() > 0) {
if (millis() - serialTimer > 2000) {
Serial.println();
Serial.println("IP address is:");
Serial.println(Ethernet.localIP());
}
serialTimer = millis();
}

}

void update_input() {
for (byte i = 0; i < sizeof(pinsMode); i++) {
if (pinsMode[i] == 'i') {
pinsValue[i] = digitalRead(i);
}
}
}

void boardInit() {
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__SAM3X8E__) //Mega or due
for (byte i = 0; i <= 53; i++) {
if (i == 0 || i == 1 || i == 10 || i == 50 || i == 51 || i == 52 || i == 53) {
pinsMode[i] = 'x';
pinsValue[i] = 0;
}
else {
pinsMode[i] = 'o';
pinsValue[i] = 0;
pinMode(i, OUTPUT);
}
}
#endif

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)//Leo or Uno
for (byte i = 0; i <= 13; i++) {
// if (i == 0 || i == 1 || i == 10 || i == 11 || i == 12 || i == 13 ) {
if (i == 0 || i == 1 || i == 7 || i == 8 || i == 10 || i == 11 || i == 12 || i == 13 ) {
pinsMode[i] = 'x';
pinsValue[i] = 0;
}
else {
pinsMode[i] = 'o';
pinsValue[i] = 0;
pinMode(i, OUTPUT);
}
}
#endif

#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
boardType = "uno";
#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || defined(__SAM3X8E__)
boardType = "mega";
#elif defined(__AVR_ATmega32U4__)
boardType = "leo";
#else
boardType = "uno";
#endif

}

Advertisement

Gebruikers-avatar
Berichten: 1853
Geregistreerd: 06 Aug 2016, 01:03

Re: Hallo, probleem met Ethernetshield en LCD opArd. Uno.

Berichtdoor Koepel » 07 Nov 2018, 21:57

Je kunt code tussen "code-tags" zetten. Dat is tussen [ code ] en [ / code ] met de "Code" knop, of tussen [ code2=cpp ] en [ /code2 ] met "Select a Syntax" en dan "C++".

Ik weet niet wat het allemaal is. Bijvoorbeeld "Sketch versie V4" en "Ethernet kit Pro" heb ik nog niet van gehoord.
Kun je dat kort uitleggen en links geven naar die dingen ?
Staat code V4 op Github ? Ik kan alleen V3 vinden (https://github.com/rabee2050/arduino-ethernet-v3/blob/master/Arduino_Ethernet/Arduino_Ethernet.ino).

Mijn eerste indruk is dat hij het op een Arduino Mega 2560 board heeft werken, en dat jij het probeert te laten werken op een Arduino Uno. Als ik beter kijk, dan lijkt dat inderdaad de mogelijke oorzaak te zijn.

Compileren met een Arduino Uno: 22866 bytes (70%) van 32256 bytes flash, en 1361 bytes (66%) ram in gebruik met 687 bytes over.
Dat zou ruim voldoende zijn als er geen String object gebruikt zou worden. Maar er worden een stuk of 16 String objecten gebruikt :o

Dit stukje kan 200 byte minder voor een Arduino Uno:
Code: Alles selecteren
char pinsMode[54];
int pinsValue[54];
Servo servoArray[53];
Met 200 byte extra ram zou het misschien net kunnen werken :?

Des te deskundiger iemand is met Arduino, des te meer diegene zegt om geen String objecten te gebruiken bij de eenvoudige Arduino boards.
Vooral bij een Arduino Uno raden de meeste af om String objecten te gebruiken. Dus helemaal geen enkel String object, maar alles met arrays voor de tekst.

Adafruit heeft een "kaboom" plaatje gemaakt met uitleg: https://learn.adafruit.com/memories-of-an-arduino/optimizing-sram.

Weet je of iemand anders deze code gebruikt ?
De code ziet er netjes uit, ik struikel alleen over de vele String objecten.

Een Arduino Mega 2560 clone kost 7 euro (https://www.aliexpress.com/item/1pcs-Mega-2560-R3-CH340G-ATmega2560-16AU-MicroUSB-Compatible-For-Mega-2560-With-Bootloader-Blue-Black/32864836449.html).

Berichten: 6
Geregistreerd: 04 Nov 2018, 11:11
Woonplaats: Delfzijl

Re: Hallo, probleem met Ethernetshield en LCD opArd. Uno.

Berichtdoor HarvdLaan » 16 Nov 2018, 07:29

Sorry Koepel voor mijn trage reactie !
Ik heb op de e.o.a. manier je uitgebreide reactie gemist. Mijn dank hiervoor.
Ik zal er vandaag induiken.
Je eerste vragen :
Rabee noemt de oudere sketch versie v3 die bij de gratis app in de play store behoort welke je voor de aansturing en uitlezing van de Arduino gebruikt. Deze is met een hoop vervelende reclame er in en werkte redelijk maar toch instabiel.
De nieuwe versie v4 , zoals hier in gekopieerd hapert wanneer ik bovenstaande wijzigingen aanbreng.

Berichten: 6
Geregistreerd: 04 Nov 2018, 11:11
Woonplaats: Delfzijl

Re: Hallo, probleem met Ethernetshield en LCD opArd. Uno.

Berichtdoor HarvdLaan » 16 Nov 2018, 08:56

"Dit stukje kan 200 byte minder voor een Arduino Uno:
Code: Alles selecteren
char pinsMode[54];
int pinsValue[54];
Servo servoArray[53];
"
Bedoel je dat ik dit bij de Uno weg kan laten ?

Ik had reeds geprobeerd om de strings korter te maken en de spaties weg te laten maar misschien niet voldoende.
Essentieel is dus geheugen !

Zal ook eens met F macro proberen. Goede leerstof voor mij.

Gebruikers-avatar
Berichten: 1853
Geregistreerd: 06 Aug 2016, 01:03

Re: Hallo, probleem met Ethernetshield en LCD opArd. Uno.

Berichtdoor Koepel » 16 Nov 2018, 09:54

De Arduino Mega 2560 heeft 54 digitale I/O pinnen en kan 48 servo motors besturen.
De Arduino Uno heeft 14 digitale I/O pinnen en kan 12 servo motors besturen.

https://store.arduino.cc/arduino-mega-2560-rev3
https://store.arduino.cc/arduino-uno-rev3
https://www.arduino.cc/en/reference/servo

Die arrays zijn zo groot voor de Arduino Mega 2560.
Wanneer je de analoge pinnen van de Arduino Uno niet als digitale pinnen wilt gebruiken, dan hoeven die arrays maar 14 groot te zijn. Ik weet niet precies hoe het 'servoArray' gebruikt wordt, maar voor de zekerheid kun je die ook 14 groot maken.

Koop alvast maar een Arduino Mega 2560, want dit blijft op de Arduino Uno voor problemen zorgen. Zodra je Ethernet of de SD library gebruikt (meestal beide) dan kun je beter overstappen naar de Arduino Mega 2560.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten