Arduino Polska Forum

Pełna wersja: Problem z wysyłaniem danych poprzez metodę GET
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, mam następujący problem. Realizuje projekt, który polega na pomiarze pyłu zawieszonego w powietrzu. Wykorzystałem w tym celu moduł Arduino Leonardo, czujnik czystości powietrza GP2Y1010AU0F i moduł Ethernet ENC28J60. Projekt zrealizowany jest w ten sposób, że za pomocą metody GET wyliczane pomiary są przekazywane do bazy MySQL co 1 minutę, i wszystko działa. Problem polega na tym, że gdy chciałbym wysyłać np co pół godziny, a nawet co 10 minut to dane nie zostają wysyłane (program się wykonuje normalnie, i na monitorze portu szeregowego tez do dobrze wygląda, lecz brak danych w bazie). Wykorzystuję do opóźniania funkcję delay(). Poniżej przedstawiam mój kod. Z góry dziękuję za odpowiedzi w czym tkwi problem Smile

Kod:
#include <UIPEthernet.h> // Used for Ethernet
#define MIN_VOLTAGE     400 // mv - próg dolnego zakresu napięcia dla braku pyłu
#define VREF           5000 // mv - napięcie referencyjne komparatora
#define PIN_LED           7 // numer pinu ILED
#define PIN_ANALOG        0 // numer pinu AOUT
#define MAX_ITERS        10 // liczba pomiarow do sredniej

// Ethernet MAC address - must be unique on your network - MAC Reads T4A001 in hex (unique in your network)
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };                                      
// For the rest we use DHCP (IP address and such)

EthernetClient client;
char server[] = "192.168.1.105"; // IP Adres (or name) of server to dump data to
int ADC_VALUE; // odczytana wartosc A0
int ITER; // numer pomiaru
float VOLTAGE; // wartosc napiecia
float DUST; // wynik
float AVG_DUST; // sredni wynik

const long second = 1000;
const long minute = second * 60;
const long hour = minute * 60;
const long day = hour * 24;

void setup() {

 Serial.begin(9600);
 Ethernet.begin(mac);

 pinMode(PIN_LED, OUTPUT);
 digitalWrite(PIN_LED, LOW);
}

float computeDust()
{
 // Blyskamy IR, czekamy 280ms, odczytujemy napiecie ADC
 digitalWrite(PIN_LED, HIGH);
 delayMicroseconds(280);
 ADC_VALUE = analogRead(PIN_ANALOG);
 digitalWrite(PIN_LED, LOW);

 // Przeliczamy na mV. Calosc mnozymy przez 11, poniewaz w module
 // zastosowano dzielinik napiecia 1k/10k
 VOLTAGE = (VREF / 1024.0) * ADC_VALUE * 11;

 // Obliczamy zanieczyszczenie jesli zmierzone napiecie ponad prog

 if (VOLTAGE > MIN_VOLTAGE)
 {
   return (VOLTAGE - MIN_VOLTAGE) * 0.2;
 }

 return 0;
}
void loop() {
  AVG_DUST = 0;
  ITER = 0;

  while (ITER < MAX_ITERS)
  {
    DUST = computeDust();
    // Do sredniej liczmy tylko prawidlowe pomiary
    if (DUST > 0)
    {
      AVG_DUST += DUST;
      ITER++;
      delay(50);
    }    
  }
 
  AVG_DUST /= MAX_ITERS;
  Serial.println(AVG_DUST);
 // if you get a connection, report back via serial:
 if (client.connect(server, 80)) {
   Serial.println("-> Connected");
   // Make a HTTP request:
   client.print( "GET /add_data.php?");
   client.print("stezenie=");
   client.print(AVG_DUST);
   client.println( " HTTP/1.1");
   client.print( "Host: " );
   client.println(server);
   client.println( "Connection: close" );
   client.println();
   client.println();
   client.stop();
   Serial.println("-> Send");
 }
 else {
   // you didn't get a connection to the server:
   Serial.println("--> connection failed/n");
 }
 delay(minute*30);
}
Jakie max opóźnienie może wygenerować funkcja Delay?
Piszesz jednak, że w monitorze działa czyli przechodzi przez Delay?

Jeśli to nie problem Delay, to podejrzyj Wireshark-iem, co w ciągu tych 30 minut robi program na Arduino. Czy wysyła ARP co określony czas? Czy gdy przestaje wysyłać dane reaguje na komendę ECHO?
Najlepiej zrób sobie w monitorze wysłanie komunikatu na serial port po Delay i zaobserwuj Wireshark-iem co sie wtedy dzieje.