Прошу помощи в оптимизации скетча

Jek
Offline
Зарегистрирован: 05.01.2014

Прошу уважаемое сообщество помочь в оптимизации скетча для отправки данных на народный мониторинг.

Основная проблема в том, что данные с датчиков 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]

 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

А зачем Вам буфер на 700 байт?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

лучше бы визнет взял чем enc28j60

Maverik
Offline
Зарегистрирован: 12.09.2012

визнет по цене в два раза дороже и у него свои тараканы тож есть, хотя и мелкие.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

enc28j60, конечно, глюкодром ещё тот, но для данной задачи вполне нормальный.

Jek
Offline
Зарегистрирован: 05.01.2014

Буфер убавил, компилятор не ругается, но значения опять 85 градусов.... куда рыть-то?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

убавлять дальше

Jek
Offline
Зарегистрирован: 05.01.2014

Буфер 300 уже не отправляется.... убавлять некуда...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не используй либу ds18b20

Jek
Offline
Зарегистрирован: 05.01.2014

а как тогда два датчика опросить?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну да. других способов нет

http://arduino.ru/forum/apparatnye-voprosy/ds18b20-pokazyvaet-127#commen...

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Зачем Вам вообще "DallasTemperature"? Одной "OneWire" достаточно, смотрите её примеры.

Jek
Offline
Зарегистрирован: 05.01.2014

От библиотеки далласа избавились, данные с датчиков верные. Но теперь не отправляет на сервер... или сервер не принимает... Подскажите пожалуйста как можно локализовать проблему?

Radjah
Offline
Зарегистрирован: 06.08.2014

Про 85 градусов:

Я вижу чтение температуры с датчика, но не вижу запросов на измерение температуры.

Jek
Offline
Зарегистрирован: 05.01.2014

Используется библиотека DallasTemperature.h.

Radjah
Offline
Зарегистрирован: 06.08.2014

В заголовке:

OneWire dswire(2); // Шина на втором пине
DallasTemperature sensors(&dswire); // На шине далласы

В лупе:

sensors.requestTemperatures(); // Орем на всю шину, что хотим температуру

// Тут надо немного подождать, иначе получим прошлы замер.

float tempc = sensors.getTempC(dsaddr); // Читаем температуру (dsaddr - адрес конкретного датчика)

 

Jek
Offline
Зарегистрирован: 05.01.2014

Я выше писал, что отказался от библиотеки для экономии памяти. Сейчас используется только 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
 

а на сайте этих данных нет....

Вот куда теперь рыть?

Jek
Offline
Зарегистрирован: 05.01.2014

Выяснилось следующее... проблемы с передачей возникают при включенном компьютере. Если компьютер выключен, то передача с Ардуины идет нормально.

Подключение компа - кабелем к роутеру Asus RT-N15. Ардуина была подключена кабелем к точке доступа D-Link 2100, точка доступа в режиме WiFi клиента по WiFi к роутеру. Грешил на WiFi, подключил Ардуину к роутеру кабелем. Изменений нет, т. е. передача данных с непонятной периодичностью...

Народ, у кого какие мысли есть?