Прошу помощи в оптимизации скетча
- Войдите на сайт для отправки комментариев
Пт, 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, подключил Ардуину к роутеру кабелем. Изменений нет, т. е. передача данных с непонятной периодичностью...
Народ, у кого какие мысли есть?