arduino ethernet mysql poorten schakelen - loop werkt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • infinite-reflex
  • Registratie: December 2017
  • Laatst online: 21-02-2022
beste allen,

ik ben met een ethernet project bezig waarbij ik de status van een uitgang in mysql opsla.
mijn arduino leest vervolgens de db uit en schakelt vervolgens desbetreffende poorten aan of uit.
alles werkt inmiddels maar ik zit met 1 probleem.

het lijkt erop of hij de status maar 1 keer ophaalt en hierbij de if statement uitvoert.
ik ga ergens in de mist maar ik zie niet hoe ik het op moet lossen.
vele varianten in het script geprobeerd maar het lukt me niet.


het is een arduino leonardo eth 2 met een mysql verbinding op een easyphp server.
de verbinding db en arduino werkt, arduino haalt ook de correcte status op.
maar doet dit slechts 1 keer.

het moet ergens in de void loop zitten, ik mis iets in de loop of er staat wat verkeerd maar wat????
de loop draait, dit weet ik door een eerdere Serial.println.
code is baggerlelijk maar ik wilde het eerst werkend hebben voor ik op ga schonen.
mijn dank zou groot zijn voor het verlossende antwoord.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(192,168,0,103);  // numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;
bool printWebData = true;  // set to false for better speed measurement
unsigned long byteCount = 0;
String inData;


void setup() {
  pinMode(2,OUTPUT);
  pinMode(4, OUTPUT);       
  pinMode(11, OUTPUT);      
  pinMode(10, OUTPUT);      

  digitalWrite(4, LOW);     
  digitalWrite(11, HIGH);   
  digitalWrite(10, HIGH);
  Serial.begin(9600);

  // start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");
  if (client.connect(server, 80)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
    // Make a HTTP request:
    client.println("GET /getstatus.php HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
  
}
void loop() {
  

 if (client.available() > 0) {
     // read the bytes incoming from the client:
     char thisChar = client.read();
     inData += thisChar;
     // echo the bytes back to the client:
//     server.write(thisChar);
     // echo the bytes to the server as well:
   //  Serial.write(thisChar);


// echo to the server what's been received to confirm we have the string
if (thisChar == '\n')
       {
         //Serial.print("\nreceived:");
         //Serial.print(inData);
             inData = "";          
     }


// if the string is "help" then return message to client


}
if (inData == " switch-10") {
Serial.println ("switch 1 off");
digitalWrite(2,LOW);
} 
if (inData == " switch-11") {
Serial.println ("switch 1 on");
digitalWrite(2,HIGH);
}
}

Alle reacties


Acties:
  • +1 Henk 'm!

  • ChaosZ0ne
  • Registratie: Januari 2006
  • Laatst online: 21-09 23:00
Ik weet niet exact hoe je backend in elkaar zit, wellicht heb je een PHP script draaien op je PC dat de daadwerkelijke Db uitleest? Want je Arduino maakt zo te zien niet direct verbinding met de DB, maar maakt verbinding met iets van een webserver.

Je probleem kan twee dingen zijn:
- Er zit geen \n in hetgeen je binnen krijgt vanaf de server. Dat is namelijk de trigger om de array inData leeg te maken. Als die niet leeg wordt gemaakt, wordt nieuwe data telkens toegevoegd aan inData, en zal deze nooit meer "switch-10" bevatten, maar eerder iets als "switch-10switch-10switch10" etc...
- Verder is er niets in je loop functie dat een request naar de webserver start. Afhankelijk van hoe je backend in elkaar zit, lijkt me dit meestal wel nodig.
Ik vermoed dat het PHP script getStatus.php telkens zal moeten worden aangeroepen. Als je dat telkens in de loop doet, zal het waarschijnlijk wel werken, ongeveer dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void loop()
{
    // verbinding opzetten met de server
    if (client.connect(server, 80))
    {
        Serial.print("connected to ");
        Serial.println(client.remoteIP());
        // Make a HTTP request:
        client.println("GET /getstatus.php HTTP/1.1");
        client.println("Host: www.google.com");
        client.println("Connection: close");
        client.println();
    }
    else
    {
        // if you didn't get a connection to the server:
        Serial.println("connection failed");
        continue;
    }

    if (client.available() > 0)
    {
        // read the bytes incoming from the client:
        char thisChar = client.read();
        inData += thisChar;

        // echo to the server what's been received to confirm we have the string
        if (thisChar == '\n')
        {
            //Serial.print("\nreceived:");
            //Serial.print(inData);
            inData = "";
        }
    }
    if (inData == " switch-10")
    {
        Serial.println("switch 1 off");
        digitalWrite(2, LOW);
    }
    else if (inData == " switch-11")
    {
        Serial.println("switch 1 on");
        digitalWrite(2, HIGH);
    }
    else{
        Serial.print("Unknown command: ");
        Serial.println(inData);
    }
}

Acties:
  • 0 Henk 'm!

  • infinite-reflex
  • Registratie: December 2017
  • Laatst online: 21-02-2022
dank voor het meedenken, echter heb ik deze revisie zelf ook al bedacht.
voor je rest klopt je analyze trouwens volledig.
voor nu ligt het antwoord in een timer die de httprequest opnieuw invoegd.

ik heb het nu werkend op een modificatie van de webclientrepeater.
hier ga ik nu mee spelen om te kijken of ik de snelheid omhoog krijg.
zodra dat functioneerd zal ik wel weeer updaten.