02-05-2018, 12:40
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
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);
}