Прошу помощи в оптимизации скетча
- Войдите на сайт для отправки комментариев
Пт, 12/12/2014 - 11:36
Прошу уважаемое сообщество помочь в оптимизации скетча для отправки данных на народный мониторинг.
Основная проблема в том, что данные с датчиков DS18B20 всегда 85 градусов. Если убрать часть кода связанного с сетевым адаптером - всё работает. Я считаю, что нехватает оперативки в Ардуино Про Мини. При компиляции пишет "Sketch uses 21 408 bytes (66%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 668 bytes (81%) of dynamic memory, leaving 380 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur."
Вот сам скетч:
[code]
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = { 0x28, 0x60, 0x66, 0xDE, 0x05, 0x00, 0x00, 0x71 }; // адрес датчика DS18B20
DeviceAddress Thermometer2 = { 0x28, 0xBA, 0x1B, 0xDE, 0x05, 0x00, 0x00, 0xFB };
int temp_in_1 = 0;
int temp_in_2 = 0;
#include <EtherCard.h>
byte mymac[] = { 0x10,0xbf,0x48,0x7c,0xbe,0xea };
#define mac "10bf487cbeea"
static byte hisip[] = { 94,19,113,221,8283 };
#define REQUEST_RATE 600000
byte Ethernet::buffer[700];
uint32_t timer;
Stash stash;
int temp_out = 0;
byte vlazhnost_out = 0;
#include "DHT.h"
#define DHTTYPE DHT22
#define DHT_1_PIN 6
DHT dhta(DHT_1_PIN, DHTTYPE);
int davlenie = 0;
#include <Wire.h>
#include <BMP085.h>
BMP085 dps = BMP085();
void setup ()
{
Serial.begin(57600);
delay(1000);
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
{
// Serial.println(F("Failed to access Ethernet controller"));
}
if (!ether.dhcpSetup())
{
// Serial.println(F("DHCP failed"));
}
static byte dnsip[] = {8,8,8,8};
ether.copyIp(ether.dnsip, dnsip);
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
ether.copyIp(ether.hisip, hisip);
ether.printIp("Server: ", ether.hisip);
while (ether.clientWaitingGw())
{
ether.packetLoop(ether.packetReceive());
}
timer = - REQUEST_RATE;
dhta.begin();
Wire.begin();
delay(1000);
dps.init(MODE_STANDARD, 5000, true);
sensors.begin();
sensors.setResolution(Thermometer1, TEMPERATURE_PRECISION);
sensors.setResolution(Thermometer2, TEMPERATURE_PRECISION);
}
void loop ()
{
DHT22_AM2302();
GY65();
DS18B20();
ether.packetLoop(ether.packetReceive());
if (millis() > timer + REQUEST_RATE)
{
timer = millis();
byte sd = stash.create();
stash.print(F("ID="));
stash.print(mac);
stash.print(F("&"));
stash.print(mac);
stash.print(F("T1"));
stash.print(F("="));
stash.print(temp_out);
stash.print(F("&"));
stash.print(mac);
stash.print(F("H1"));
stash.print(F("="));
stash.print(vlazhnost_out);
stash.print(F("&"));
stash.print(mac);
stash.print(F("T2"));
stash.print(F("="));
stash.print(temp_in_1);
stash.print(F("&"));
stash.print(mac);
stash.print(F("P1"));
stash.print(F("="));
stash.print(davlenie);
stash.print(F("&"));
stash.print(mac);
stash.print(F("T3"));
stash.print(F("="));
stash.print(temp_in_2);
stash.save();
Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
"Host: narodmon.ru" "\r\n"
"Content-Length: $D" "\r\n"
"\r\n"
"$H"),
stash.size(), sd);
ether.tcpSend();
Serial.println(F("Done"));
}
}
void DHT22_AM2302()
{
vlazhnost_out = dhta.readHumidity();
temp_out = dhta.readTemperature();
if (isnan(temp_out) || isnan(vlazhnost_out))
{
// Serial.println(F("Net dannih temperaturi i vlazhosti"));
}
}
void GY65()
{
long Pressure = 0;
dps.calcTrueTemperature();
delay(1000);
dps.getPressure(&Pressure);
davlenie = Pressure/133.3;
}
void DS18B20()
{
temp_in_1 = sensors.getTempC(Thermometer1);
temp_in_2 = sensors.getTempC(Thermometer2);
}
[/code]
А зачем Вам буфер на 700 байт?
лучше бы визнет взял чем enc28j60
визнет по цене в два раза дороже и у него свои тараканы тож есть, хотя и мелкие.
enc28j60, конечно, глюкодром ещё тот, но для данной задачи вполне нормальный.
Буфер убавил, компилятор не ругается, но значения опять 85 градусов.... куда рыть-то?
убавлять дальше
Буфер 300 уже не отправляется.... убавлять некуда...
не используй либу ds18b20
а как тогда два датчика опросить?
ну да. других способов нет
http://arduino.ru/forum/apparatnye-voprosy/ds18b20-pokazyvaet-127#commen...
Зачем Вам вообще "DallasTemperature"? Одной "OneWire" достаточно, смотрите её примеры.
От библиотеки далласа избавились, данные с датчиков верные. Но теперь не отправляет на сервер... или сервер не принимает... Подскажите пожалуйста как можно локализовать проблему?
Про 85 градусов:
Я вижу чтение температуры с датчика, но не вижу запросов на измерение температуры.
Используется библиотека
DallasTemperature.h.В заголовке:
В лупе:
Я выше писал, что отказался от библиотеки для экономии памяти. Сейчас используется только onewire. Температура считывается нормально, но данные на народный мониторинг уходят с непонятной периодичностью... То отправляютя как положено раз в шесть минут, то два-три часа нет отправки.
Монитор пишет что отправка была:
IP: 192.168.1.7
GW: 192.168.1.1
DNS: 8.8.8.8
Server: 94.19.113.221
[memCheck]
556
ID=10bf487cb00a&10bf487cb00aT1=0&10bf487cb00aH1=82&10bf487cb00aT2=38
&10bf487cb00aP1=769&10bf487cb00aT3=25
[memCheck]555
Done
ID=10bf487cb00a&10bf487cb00aT1=0&10bf487cb00aH1=82&10bf487cb00aT2=38
&10bf487cb00aP1=769&10bf487cb00aT3=23
[memCheck]555
Done
а на сайте этих данных нет....
Вот куда теперь рыть?
Выяснилось следующее... проблемы с передачей возникают при включенном компьютере. Если компьютер выключен, то передача с Ардуины идет нормально.
Подключение компа - кабелем к роутеру Asus RT-N15. Ардуина была подключена кабелем к точке доступа D-Link 2100, точка доступа в режиме WiFi клиента по WiFi к роутеру. Грешил на WiFi, подключил Ардуину к роутеру кабелем. Изменений нет, т. е. передача данных с непонятной периодичностью...
Народ, у кого какие мысли есть?