Arduino mini pro + ENC28J60+dht22+bmp180. проблема в передачи данных.

andrej777
Offline
Зарегистрирован: 07.08.2014

 

Arduino mini pro + ENC28J60+dht22+bmp180

Проблема в отправке данных на http://narodmon.ru , а именно не постоянно отправляет данные. в код забит интервал в 6 минут, в реале данные отправляются могут через любое время. ввел сброс мк через 30 минут, теперь он не зависает больше чем на 30мин. но это не выход. вот и хотел бы решить проблему.

код

#include <EtherCard.h>
#include <Wire.h>
#include <BMP085.h>
BMP085 bmp;
#include "DHT.h"
#define DHTPIN 3
#define DHTTYPE DHT22
#define LED 8
#define svet 13
DHT dht(DHTPIN, DHTTYPE);
#define REQUEST_RATE 360000 // milliseconds
static byte mac[] = { МАК адресс}; //В этой строке задайте свой MAC адрес
static byte hisip[] = { 94, 19, 113, 221, 8080 }; //Здесь надо указать IP адрес сайта narodmon.ru
String macstring;
byte Ethernet::buffer[500];
static long timer;
Stash stash;

void setup() {
Serial.begin(57600);
delay(1000);
bmp.begin();
dht.begin();
if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0)
Serial.println( "Failed to access Ethernet controller");

if (!ether.dhcpSetup())
Serial.println("DHCP failed");

//overwrite DNS with google's if there are problems with DNS setup
static byte dnsip[] = {8, 8, 8, 8};

ether.copyIp(ether.dnsip, dnsip);
ether.printIp("My IP: ", ether.myip);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
ether.copyIp(ether.hisip, hisip);
ether.printIp("Server: ", ether.hisip);

while (ether.clientWaitingGw())
ether.packetLoop(ether.packetReceive());
Serial.println("Gateway found");

macstring = "";
for (int k = 0; k < sizeof(mac) / sizeof(byte); k++)
{
char msg[3];
sprintf(msg, "%02X", mac[k]);
if (macstring != "#") macstring += "-";
macstring += msg;
}
pinMode(svet, OUTPUT);
timer = - REQUEST_RATE; // start timing out right away


}

void loop() {


if (millis() > 1800000) { // количество полных часов с момента последнего срабатывания
digitalWrite(LED, HIGH); // включение реле, которое выключает питание МК
}
ether.packetLoop(ether.packetReceive());

if (millis() > timer + REQUEST_RATE)
{
timer = millis();

byte sd = stash.create();
stash.print("ID=");
stash.print(macstring);
Serial.println("\n\n\nPosting...\n");
digitalWrite(svet, LOW); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(svet,HIGH );
delay(1000); // wait for a second
String result;
char msg[50];
result = macstring + "\n";
stash.print("&");
stash.print(macstring);
stash.print("01");
stash.print("=");
stash.print(bmp.readTemperature());
stash.print("&");
stash.print(macstring);
stash.print("02");
stash.print("=");
stash.print(bmp.readPressure() );
delay(1000);
float h = dht.readHumidity();
float t = dht.readTemperature();
stash.print("&");
stash.print(macstring);
stash.print("03");
stash.print("=");
stash.print(t);
stash.print("&");
stash.print(macstring);
stash.print("04");
stash.print("=");
stash.print(h);
stash.print("&");
delay(1000);

stash.save();

// generate the header with payload - note that the stash size is used,
// and that a "stash descriptor" is passed in as argument using "$H"
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);

// send the packet - this also releases all stash buffers once done
ether.tcpSend();
for (word i = 0, n = Stash::length(); i < n; ++i) {
char c;
Stash::extract(i, 1, &c);
Serial.print(c);
}

//Serial.println("Done");
}

}

данные на сервер уходят в таком формате 2014-08-07T13:16:30+04:00    POST    ID=-мак&-мак01=30.51&-мак02=100289&-мак03=33.90&-мак04=26.30&

как решить проблему со стабильность выдачи данных на сервер. ? 
http://visualbooster.com/share/20140807131530780.png то как он щас отправляет, а должно быть через каждые 6 мин. 
 

zhenious
Offline
Зарегистрирован: 03.07.2014

А вы обратили внимание на то, что временные интервалы в последовательности на приведенной вами картинке кратны 6 ?

Что это значит ? Это значит, что ардуина исправно раз в 6 мин делает свое дело, не зависает.

andrej777
Offline
Зарегистрирован: 07.08.2014

да вы правы, просто не тот скрин выложил. но вот посмотрите на график http://visualbooster.com/share/20140807134403483.png
там видно длинные линии. задержка между отправками может находиться в разных диапазонах. от 6мин до 30мин. http://narodmon.ru/1752 адресс датчиков. посмотрите на время между точками. 
и я сделал что бы она перезагружалась каждые 30мин. но это плохое решение. та и не помогло. 

leshak
Offline
Зарегистрирован: 29.09.2011

Вставка программного кода в тему/комментарий (кстати это прикрепленная тема)
Мигаем светодиодом без delay() | Аппаратная платформа Arduino (кстати это один из базовы примеров, в разделе "программирование").

leshak
Offline
Зарегистрирован: 29.09.2011

Ну и, за одно, смотрим
millis() | Аппаратная платформа Arduino

обращаем внимание на тип возвращаемого значения.

leshak
Offline
Зарегистрирован: 29.09.2011

Еще проблемы со стабильностью могут быть вызваны плохим питанием шилда  (то что выдает дуина на 3.3v не всегда хватает)
И... раз у вас столько библиотек, да еще enc28j60 с которым весь TCP/IP стек програмнно реализуется, то ... банальная нехватка памяти может быть.

 

andrej777
Offline
Зарегистрирован: 07.08.2014

"Вставка программного кода в тему/комментарий (кстати это прикрепленная тема)" да, извините первое сообщение на этом форуме.

остаток озу 435 байт.
питание щшильда отдельное 3.3в

leshak
Offline
Зарегистрирован: 29.09.2011

andrej777 пишет:

остаток озу 435 байт.

Есть подозрение что это не так. Откуда взяли эту цифру?

И... разбирайтесь со своим millis()/timer.

Не уверен что они у вас "причина текущих проблем", но то что с ними проблемы есть - это точно (где-то через 24-дня вылезут, может раньше).
Вынсите весь свой код отсылающий данные на сервер в отдельную функцию

sendDataToServer(){
  ... сбор инфы с датчиков и т.п.

}

 

а в loop() оставте свой свой millis()/timer и вызов это sendDataToServer().... легче будет отдалживать отедльно "логику отсылки" и отдельно "логику переодичности". Можно будет временно подменять вызов sendDataToServer(), на какую-нибудь sendDataToSerial() и смотреть в Serial... что у нас "все вовремя делается". Когда с "вовремя" пробелма решится - тогда уже саму отсылку делать.

 

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

И... разбирайтесь со своим millis()/timer.

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

andrej777
Offline
Зарегистрирован: 07.08.2014

Память смотрел через библиотеку, выводило в порт.
Спасибо что дали направление в котором копать. Буду пробовать.

leshak
Offline
Зарегистрирован: 29.09.2011

andrej777 пишет:
Память смотрел через библиотеку,.

Ага. Ну тогда, возможно "правда". А то новая IDE тоже говорит, еще при компиляции сколько RAM свободно и многие принимаю это "за чистую монету", не понимая что при выполнении "расклады могут поменться".
Помониторте еще, что память со временем, не уменьшается.

Если, в итоге, дело окажется все-таки в памяти, то я бы пробовал аккуратненько уменьшить буффер
byte Ethernet::buffer[500];

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

Еще расход памяти может давать 

String macstring;

Лично я предпочитаю обычными строками пользоватся. Хоть и гиморней, зато четко понимаешь сколько там памяти расходуется. Сравнивать обычный через strcmp

И вот вещи типа таких:
 

char msg[3];
sprintf(msg, "%02X", mac[k]);

нужно внимательно перепроверять. Что-бы случайно не превысить размеь msg[3], не забывать что один символ по нулев должен быть выделен и т.п. ( тут вроде все впорядке, беглям взлядом, вроде должно трех хватать, но вот "все подобное" перепроверить).

А еще вот тут, что-то немного "смущает"

// send the packet - this also releases all stash buffers once done
ether.tcpSend();
for (word i = 0, n = Stash::length(); i < n; ++i) {
char c;
Stash::extract(i, 1, &c);
Serial.print(c);

С одно стороны в комменте написанно "release all stash buffers", и тут же уже ПОСЛЕ этого явная попытка выводить содержимое этого stash.
То есть, либо выводим то что уже "в неопределенном состоянии", либо очистка, на самом деле - не произошла.
Опять-таки, я не уверен что "проблема тут" (лень лезть смотреть реализацию этого Stash), но "я бы обратил внимание".

 

andrej777
Offline
Зарегистрирован: 07.08.2014

byte Ethernet::buffer[500]; было 700, уменьшил.

3-6 строки в коде что вы привели. То вывод данных что идут на сервер. То для проверки.
Можно откл. Но ничего не по меняется .
Я все же думаю что проблема вmillis()/timer как написали выше.
Буду дома попробую переделать. Я пока учусь, не очень понимаю что делаю. Но попробую.
Насчёт ОЗУ, сутки отработал. ОЗУ не уменьшилось. Стабильно держит.

leshak
Offline
Зарегистрирован: 29.09.2011

andrej777 пишет:
byte Ethernet::buffer[500]; было 700, уменьшил. 3-6 строки в коде что вы привели. То вывод данных что идут на сервер.

Да я понял, что это.. я же не сказал что "там неправильно". Просто обратил внимание что "подобные вещи нужно перепроверять". При работе со строками и массивами. Когда что-то глючит, то в первую очередь смотришь где есть потенциальные "выходы за границы массива".

andrej777 пишет:
Я все же думаю что проблема вmillis()/timer как написали выше. 

Ну там проблема есть... но, по идее она должна проявится попозже, а не сразу.
Вообщем начните с "разделения" логики по нескольким функциям. В "единой простыне" - трудно что-то найти.

Я бы еще и "чтение датчиков" и "отсылку данных" отделил. В отдельной функции - опросили все датчики. Показания сохранили куда-то в переменную.
В отдельной - отсылку данных из этих переменных, а прямо чтение.

Тогда можно взять и отдельно попосылать даныне (да хотя-бы и просто нули), убедится что приходят.. отедельно фунцию опроса датчиков подергать...

что-то такое в итоге:

 

unsigned long timer; // ВНИМАНИЕ НА ТИП ПЕРЕМЕННОЙ
void loop(){
    ......
    if(millis()-timer<INTERVAL){  // именно так, через вычитание узнаем "сколько прошло времени

        Serial.print("Try collect data.....");
        collectSensordData();
        sendDataToSerial();
        sendDataToServer();
    }
}

void     collectSensordData(){
   // опрашиваем датчики, сохраняем в переменные
}

void  sendDataToSerial(){
   // обыкновенеыми Serial.println() выводим данные на ком
}

void sendDataToServer(){
    // а вот тут уже через шилд эти же данные отправляем
}

Ну и комбинируя (закоменчивая/раскоменчивая) вызов этих функций collectSensorData(), sendDataToSerial(), sendDataToServer()

можно, в итоге выяснить "кто же пакостит". "По частям" скетч погонять.

leshak
Offline
Зарегистрирован: 29.09.2011

А еще... лучше всего вместо

#define REQUEST_RATE 360000 // milliseconds

вот так писать

#define REQUEST_RATE 360000UL // milliseconds

без "UL" на конце, тоже могут "заподлянки" вылазить.

andrej777
Offline
Зарегистрирован: 07.08.2014

Пока сделал такие изменения 







#define REQUEST_RATE 360000UL // milliseconds
static byte mac[] = { мак }; //В этой строке задайте свой MAC адрес
static byte hisip[] = { 94, 19, 113, 221, 8080 }; //Здесь надо указать IP адрес сайта narodmon.ru
String macstring;
byte Ethernet::buffer[500];
unsigned long timer;
Stash stash;

сделал выдачу минуту , 10 минут смотрел. стабильно до секунды отправляло. 
щас выставил 6мин. посмотрю как будет. 

1 минута и 6 мин http://visualbooster.com/share/20140807212945984.png такого раньше не было :) стабильно. 

xorkrus
Offline
Зарегистрирован: 22.09.2013

Господа, я вмешаюсь в вашу беседу со своим вопросом :)

#include <Wire.h>               // Common library
#include "DHT.h"                // DHT11 & DHT22 Library
#include "af_BMP085.h"          // Simple library for BMP085
#include <EtherCard.h>          // ENC28J60 Library
#include <LiquidCrystal_I2C.h>  // Display with PFC8574
#include "Timer.h"              // http://github.com/JChristensen/Timer

// Setting vars
#define BACKLIGHT_PIN 3 // Display backlight with npn-transistor
#define DHT_S1_PIN A1 // DHT22 / AM2302
#define DHT_S2_PIN A0 // DHT11
#define D_ORANGE_PIN 7 // Diode orange
#define D_GREEN_PIN 8 // Diode green
#define BUZZER_PIN 9 // Buzzer
#define WIND_PIN 4 // Anemometer
#define BUFFER_SIZE 600 // Size of TCP buffer 500

LiquidCrystal_I2C lcd(0x20,4,5,6,0,1,2,3,7, POSITIVE);
Timer t; //instantiate the timer object
dht dht_s1, dht_s2;
Adafruit_BMP085 bmp;
static uint8_t mymac[6] = { 0x54, 0x55, 0x55, 0x10, 0x25, 0x24 };
static uint8_t myip[4] = { 192, 168, 1, 88 };
static uint8_t gwip[4] = { 192, 168, 1, 1 };
static byte dnsip[] = { 8, 8, 8, 8 };
static byte hisip[] = { 94, 19, 113, 221, 8080 };
uint32_t timer;
Stash stash;
byte session;
byte Ethernet::buffer[BUFFER_SIZE];
int humidity = 0, temp_dht = 0, humidity2 = 0, temp_dht2 = 0, temp_bmp = 0, temp = 0;
int32_t pressure_pa = 0, pressure_mm = 0;

void setup(void)
{
  pinMode(BACKLIGHT_PIN, INPUT);           // set pin to input
  digitalWrite(BACKLIGHT_PIN, HIGH);       // turn on pullup resistors
  bmp.begin();
  lcd.home();
  lcd.begin(24,2);
  delay(3000);
  ////////////////////
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.copyIp(ether.dnsip, dnsip);
  ether.copyIp(ether.hisip, hisip);
  ether.staticSetup(myip, gwip);
  lcd.clear();
  nm_upd();
  DisplayTotal();
  // 600000 - 10 min
  // 60000 - min
  // 1000 - sec
  // 100 - millisec
  // 10 - microsec
  // 1 sec = 1000ms = 1000000uS
  //int tickEvent1 = t.every(1, eth_upd); // 100 iteration per second - update ethernet catch   ---change 1
//  int tickEvent2 = t.every(600000, nm_upd); // 1 iteration in 10 minute - narodmon.ru update
  int tickEvent2 = t.every(15000, nm_upd); // 1 iteration in 10 minute - narodmon.ru update
  int tickEvent3 = t.every(60000, DisplayTotal); // 1 iteration 1 minute - update display information
//  int tickEvent4 = t.every(15000, xively_upd);
}

void loop(void)
{
    t.update();
    ether.packetLoop(ether.packetReceive());
}

void nm_upd() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("[ Now updating         ]");
  lcd.setCursor(0,1);
  lcd.print("[          narodmon.ru ]");
//  MS_SensUpdate();
  byte sd = stash.create();
  stash.print("ID=54-55-55-10-25-24&545555102524CDEF=25");
/*  stash.println("545555102524CDEF=");
  stash.println(temp_dht);
  stash.println("&5455551025240123=");
  stash.println(humidity);
  stash.println("&5455551025244567=");
  stash.println(pressure_mm);
  stash.println("#545555102524ABCD#");
  stash.print(temp_bmp);
  stash.println("#545555102524DCBA#");
  stash.print(temp_dht2);
  stash.println("#545555102524FEDC#");
  stash.print(humidity2);
  stash.println("##");*/
  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);
  // send the packet - this also releases all stash buffers once done
  ether.tcpSend();
  delay(3000);
  lcd.clear();
  DisplayTotal();
}

void DisplayTotal() {
}

// Sensors
// Update all sensors one time
void MS_SensUpdate() {
  MS_BMP085();
  MS_DHT22();
  MS_DHT11();
}

// Update only BMP085
void MS_BMP085() {
  temp_bmp = bmp.readTemperature();
  pressure_pa = bmp.readPressure();
  pressure_mm = pressure_pa/133.3;
}

// Update only DHT22
void MS_DHT22() {
  if (dht_s1.read22(DHT_S1_PIN) == DHTLIB_OK) {
    humidity = dht_s1.humidity;
    temp_dht = dht_s1.temperature;
    temp = temp_dht;
  } else {
    temp = temp_bmp;
  }
}

// Update only DHT11
void MS_DHT11() {
  if (dht_s2.read11(DHT_S2_PIN) == DHTLIB_OK) {
    humidity2 = dht_s2.humidity;
    temp_dht2 = dht_s2.temperature;
    temp = temp_dht2;
  } else {
    temp = temp_bmp;
  }
}

Собственно практически тоже самое что и у ТС, но проблема в другом. На народмон никаких данных не поступает. Иногда появляется строка

2014-08-07T22:53:39+04:00	API	{"uuid":"xxxx","api_key":"xxxx","cmd":"sensorInfo","sensor":[8429,8430,8431,8430,8431,8429,3022]}

и все.

tcpdump на роутере показывает

23:03:40.436527 IP 192.168.1.88.2825 > mail.net13.info.www: Flags [S], seq 16128, win 768, options [mss 550], length 0

и последнее length меня смущает. Я же напрямую прописал что отправить уже. В чем мб проблема?

 

leshak
Offline
Зарегистрирован: 29.09.2011

2xorkrus:
а вы тему перечитали? Все возможные траблы (питание и т.п.) перепроверили?
То что памяти хватает удостоверились?

Или вот на "в чем мб проблема", нужно сейчас еще раз все перечислить, но уже "лично для вас"?
 

И вот я не понимаю, ну что вот за манечка пошла "взять всего железа побольше", все слепить вместе а потом пытаться среди всего этого найти "что же не работает".

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

Просто взять пример из библиотеки и взять что-то попытаться "послать". Тупо что-то захадкоженное. Просто строку какую-нибудь. КАкиет-то цифры 1,2,3... Убедится что отсылка данных проходит нормально. Хотя-бы одна.
Когда это "заработает", тогда добавлять "переодичнсоть". Через мillis() или сторонние библиотеки.
Вначале убедится что "переодичность работает". Обычным Serial.println увидеть что "все вовремя запускается".

Когда "и то и другое" заработало, тогда вместе... отсылаем одну строку переодично. Убеждаемся что приходит на сервер.

Когда уверенны что "связ работает, отсылать переодично - железно можем".
Начинаем уже датчики подключать.
Подключили один - проверили что рабоатет.
Подключили второй - провреили что работает.
Подключили экран .... "оппа, не работет" (это я к примеру) - ну значит в первую очередь нужно смотреть тот код который с экраном работает.

ПОшагово. Каждый раз отталкиваясь от "уже железно работает".
А не взяли кучу всего, намешали.... и потом "ой, что-то не так...".

Не, конечно еще то хита прошлой недели, когда вывалили 1000 строк, кода. с немецкими названиями функций и коментами. и спросили "оно делает не то что я хочу, почему?" вы еще не дотянули, конечно. Размер скетче еще "можно проглотить", но вот не могу понять зачем же самому себе жизнь-то усложнять? (честно даже не сколько "наехать" хочу, сколько действительно удивляюсь).

 

andrej777
Offline
Зарегистрирован: 07.08.2014

http://visualbooster.com/share/20140807231617687.png за час стабильно. поставлю до завтрешнего вечера.
Спасибо, помогли разобраться. и кое что нового узнал.  

xorkrus
Offline
Зарегистрирован: 22.09.2013

leshak, отвечаю: с питанием все в порядке и памяти хватает. этот этап я уже проходил, правда пытался юзать другую библиотеку.

Ну и не додумался я отключить всё, не додумался упростить код до минимума. Ну и...

#include <Wire.h>               // Common library
#include <EtherCard.h>          // ENC28J60 Library
#include "Timer.h"              // http://github.com/JChristensen/Timer
Timer t; //instantiate the timer object
static uint8_t mymac[6] = { 0x54, 0x55, 0x55, 0x10, 0x00, 0x25 };
static uint8_t myip[4] = { 192, 168, 1, 88 };
static uint8_t gwip[4] = { 192, 168, 1, 1 };
static byte dnsip[] = { 8, 8, 8, 8 };
static byte hisip[] = { 94, 19, 113, 221, 8080 };
Stash stash;
byte Ethernet::buffer[600];

void setup(void)
{
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.copyIp(ether.dnsip, dnsip);
  ether.copyIp(ether.hisip, hisip);
  ether.staticSetup(myip, gwip);
  int tickEvent2 = t.every(15000, nm_upd); // 1 iteration in 10 minute - narodmon.ru update
}
void loop(void)
{
    t.update();
    ether.packetLoop(ether.packetReceive());
}
void nm_upd() {
  byte sd = stash.create();
  stash.println("ID=54-55-55-10-25-24&5455551025-24CDEF=25");
  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);
  // send the packet - this also releases all stash buffers once done
  ether.tcpSend();
}

Не работает :)

IP 192.168.1.88.2982 > mail.net13.info.www: Flags [S], seq 5632, win 768, options [mss 550], length 0

Повторно перепроверил питание, и работоспособность модуля - все нормально.

Собственно в первом варианте прошивки, все тоже самое, только с настоящими данными на экране. А "экранчик" нужен для отладки ибо программирую через ISCP и доступа к уарту временно нет.

#include <EtherCard.h>          // ENC28J60 Library
#define BUFFER_SIZE 600
static uint8_t mymac[6] = { 0x54, 0x55, 0x55, 0x10, 0x00, 0x25 };
static uint8_t myip[4] = { 192, 168, 1, 88 };
static uint8_t gwip[4] = { 192, 168, 1, 1 };
static byte dnsip[] = { 8, 8, 8, 8 };
static byte hisip[] = { 94, 19, 113, 221, 8080 };
Stash stash;
byte Ethernet::buffer[BUFFER_SIZE];
unsigned long lastmillis = 0;

void setup(void)
{
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.copyIp(ether.dnsip, dnsip);
  ether.copyIp(ether.hisip, hisip);
  ether.staticSetup(myip, gwip);
}
void loop(void)
{
  ether.packetLoop(ether.packetReceive());
  if (millis() - lastmillis == 10000){
    send();
  }
}

void send() {
  byte sd = stash.create();
  stash.println("ID=54-55-55-10-25-24&5455551025-24CDEF=25");
  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();
}

Совсем все убрал. даже библятеку таймера. Все равно не отправляется.

IP 192.168.1.88.2850 > mail.net13.info.www: Flags [S], seq 2560, win 768, options [mss 550], length 0

 

leshak
Offline
Зарегистрирован: 29.09.2011

> А "экранчик" нужен для отладки

Для отладки, зачастую проще использовать светодиод на какой-то ножке (или втсроенный 13-тый). Что-то типа "мигнул когда послал". Это всяко проще чем экран... (то выравнивание не то, то еще что-то-то...). Да и скажем когда нужно четко временные интервалы отслеживать, можно логическим анализатором или осцилографом смотреть точно "в какой момент ножка дрягнулас" (выполнилась интересующая строчка кода).

Но... " и доступа к уарту временно нет." - это не дело. Без этого что-то разрабатывать/отлаживать, это, простите, как занятия сексом в гамаке стоя на одной ноге. И так нормальной отладки нет в арудине, так еще и "эрзац" недоступен...

Далее...

 

if (millis() - lastmillis == 10000){

Это фигня. Шансы что "сработает" пара процентов. У вас же нет гарантии, что строчка попадет на выполнение точно в нужную, круглую миллисекунду. Вот чуть-чуть где-то "задержался", на одну миллисекунду.... и все. "поезд ушел".

Правда, для объективности, нужно признать что я вчерась, засыпая, тоже "фигню упорол":
 

if(millis()-timer<INTERVAL){  // именно так, через вычитание узнаем "сколько прошло времени

Правильно будет так:

if(millis()-timer>=INTERVAL){  // именно так, через вычитание узнаем "сколько прошло времени

далi буде....

leshak
Offline
Зарегистрирован: 29.09.2011

Итак, мы имеем два хоста. Которые между собой должны общатся, но не общаются...
Возможные места проблем:
1. Проблема у передающего
2. Проблема у принимающего
3. Проблема между ними

Для начала, проверяем естественно то что "проще проверить". "Передающего и принимающего". Вначале что они вообще хоть как-то работают.

Как проще всего проверить?  Да банальным ping-гом.
Пингуем шилд.
Пингуем целевой хост.

А еще "вопрос на засыпку": из скольки цифр состоит IP ардесс?  (кстати вопрос относится и к andrej777)

Далее:
то что вы "упростили" - это хорошо. Тольк обычно начинают работу с шилдами даже не со своих "упрощенных примеров", а с примеров идущих с библиотекой.
Посмторите примеры библиотеки, не замечаете никаких отличий вашего кода в вопрсое  инициализации шилда?

Или... если не примеры, то хотя-бы на код andrey777 посмотрите. Как известный пример "который работает". Сами же сказали что у вас задача "практически таже самая", так почему бы не проиграться в игру "найди 10-ть отличий" (особенно в setup())?  ИЛи вообще взять его код, убедится что он работает у вас и начать его потихоньку (по одному шагу) начать переделывать в ваш и смотреть на какой переделке "перестанет работать"?

 

xorkrus
Offline
Зарегистрирован: 22.09.2013

Кому светодиод, а кому экранчик. это уже зависит от тараканов. мне экран вполне себе уарт заменяет. Пинги идут в обе стороны. разница в сетапе из-за дхцп и статики. У меня все на статике.

if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0)
Serial.println( "Failed to access Ethernet controller");

static byte dnsip[] = {8, 8, 8, 8};

ether.copyIp(ether.dnsip, dnsip);
ether.printIp("My IP: ", ether.myip);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
ether.copyIp(ether.hisip, hisip);
ether.printIp("Server: ", ether.hisip);

while (ether.clientWaitingGw())
ether.packetLoop(ether.packetReceive());
Serial.println("Gateway found");

Конструкции if не считаю нужными в данном месте, так как мак присваивается и енк запускается. роутер устройство видит. принтип туда же. гатевей также задан статически. И на этом гатевее я вижу идущие пакеты по нужному адресу, но почему-то нулевой длины.

По поводу millis вы правы, выполняется код 1 раз, а потом молчит, но большего и не требуется для отладки пока.

Пробовал делать отправку на основе экземплового скетча xively, но почему-то не сделал. Попробую ещё раз. Там данные отправлялись (кстати там я статику прописывал также как и в том, что выкладывал ранее.).

Возможно я что-то упускаю, но я вижу проблему именно в выполнении пустого запроса, а не в ините контроллера сети. Но попробую ещё раз с ксивели, как уже писал.

leshak
Offline
Зарегистрирован: 29.09.2011

>Конструкции if не считаю нужными в данном месте, так как мак присваивается и енк запускается. роутер устройство видит. 
Зря...
Я бы все-таки делал их... когда возявкаешься, лучше моментально видиеть "где-то что-то отвалилось".
Если не в Serial, то хотя-бы LED, типа "ошибка" зажигать.
 
Ну и... я смотрю, у вас строка

while (ether.clientWaitingGw())

появилась. Я ее имел ввиду, а не "динамику/статику". Раз мы куда-то на удаленный хост стучимся, то нам явно нужен гейтвей. и стоит долждаться пока он будет "готов".

и проверок, и всяких println (ну экран, лед и т.п.) все-таки "побольше". они помогают не только "поймать fail", но и вещи типа "gateway found" - помогают иметь уверенность что "вот этот кусок точно работает".
 

А еще... обычно не лишним сообщать какая у вас плата. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

И попробуйте, все-таки, без экрана. Причем не только "из скетча убрать", но и физически его отключить. 
Вообщем что-бы была "плата и enc28j60". И "больше ничего".
Кстати раз вы шьете по ICPS. Еще и программатор отключить желательно на момент проверки.
Как ни крути, а висит-то он на тах же пинах, что и модуль.

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Лешак опять пристал к специалисту. Ты же видишь товарищ все знает, все умеет. Только где то ошибка, но не по его же вине. Просто это враги с ним шутят. А ты заместо исправить ошибку, начал ему читать лекции, да еще просить делать как принято. Не можешь исправить ошибку, ну так и сиди молча. :)

xorkrus
Offline
Зарегистрирован: 22.09.2013

Puhlyaviy, Враги-враги, сам видел! Всё злостные ливийские власти задумали...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

xorkrus пишет:

Puhlyaviy, Враги-враги, сам видел! Всё злостные ливийские власти задумали...


Ну тут тогда только один выход. Когда пишеш код и заливаешь его в ардуино. Накрывайся одеялом с головой. Чтобы враги не подглядывали.

xorkrus
Offline
Зарегистрирован: 22.09.2013

А одеяло-то помогло!, спасибо Puhlyaviy!

leshak, пополам на пополам - но все заработало, спасибо.  Правда на дхцп, но ничо. роутер сам ему ип назначит нужный.

andrej777
Offline
Зарегистрирован: 07.08.2014

Обнаружил такую проблему. 
из за чего сбивается время отправки. 
http://visualbooster.com/share/20140809164711375.png это комп (сетевой кабель был вытащен )
потом, ничего не делая , я подключил просто сетевой кабель до компа. http://visualbooster.com/share/20140809174508765.png
стабильность показаний стала отличной!
может что то с роутером? типа когда через роутер идёт какой то обмен данными, то вся система правильно работает, а если выкл. комп, или вытащить сетевой кабель , что бы никто инет не сосал, то начинаются вот такие глюки. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Предлагаете достать хрустальный шар? Погадать на тему как у вас раутер глючит? Попробуйте другой раутер.

andrej777
Offline
Зарегистрирован: 07.08.2014

роутер тплинк Model No. TL-WR340G/TL-WR340GD
у Вас Puhlyaviy  , наверное куча их дома?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

andrej777 пишет:

роутер тплинк Model No. TL-WR340G/TL-WR340GD
у Вас Puhlyaviy  , наверное куча их дома?


У меня 4 раутера дома и один свич и все разные. Одного не хватает. Возмите у соседа на 10 минут для эксперементов.

andrej777
Offline
Зарегистрирован: 07.08.2014

была бы возможность, взял бы. и не писал бы тут. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

andrej777 пишет:

была бы возможность, взял бы. и не писал бы тут. 


И теперь ждете что кто то соберет точно такое как у вас. С такими же проводами и косяками и проверит? Да вы оптимист.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Хорошо. Давайте ждать вместе. Не пойму где вам мерещится флуд. Я с тем же успехом могу всю вашу тему назвать флудом ибо не о чем.

xorkrus
Offline
Зарегистрирован: 22.09.2013

andrej777, я использовал вот эту библиотеку

int tickEvent2 = t.every(15000, nm_upd); // 1 iteration in 10 minute

Выполняется вполне себе четко и без обсчетов всяких миллисов. Сбоев со временем небуло вообще.

andrej777
Offline
Зарегистрирован: 07.08.2014

вся проблема в роутере. как тока откл комп. сразу начинает глюки давать. я так понял если через роутер не идёт инет. то он засыпает, может сделать что бы ардуинка что то пинговала постоянно ? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

andrej777 пишет:

вся проблема в роутере. как тока откл комп. сразу начинает глюки давать. я так понял если через роутер не идёт инет. то он засыпает, может сделать что бы ардуинка что то пинговала постоянно ? 

может настроить раутер? или купить нормальный который не будет засыпать :)

andrej777
Offline
Зарегистрирован: 07.08.2014

leshak пишет:

А еще "вопрос на засыпку": из скольки цифр состоит IP ардесс?  (кстати вопрос относится и к andrej777)

0x00, 0x02, 0x27, 0xAF, 0x25, 0xB0 

щас сделал кое какие изменения из того что вы писали, 15 часов отработала и перестала выдавать.
чем ближе кконцу было дело тем больше становились задержки, 10,15,20,30, ... конец, перестали ваще идти. 
но если комп включен. то идут данные стабильно.
и ещё вопрос, можно ли данные отсылать  меньше чем 5мин, не забанять?
и почему то я выставляю показ данны каждые 5мин, а он отображает как 6мин. так и должно быть?
http://visualbooster.com/share/20140813213727312.png вот, это я выставил 5мин.

 

leshak
Offline
Зарегистрирован: 29.09.2011

andrej777 пишет:

leshak пишет:

А еще "вопрос на засыпку": из скольки цифр состоит IP ардесс?  (кстати вопрос относится и к andrej777)

0x00, 0x02, 0x27, 0xAF, 0x25, 0xB0 

Что это было?

andrej777 пишет:

щас сделал кое какие изменения из того что вы писали, 15 часов отработала и перестала выдавать.

Ага. То есть предполагается что я помню, что и кому я советовал неделю назад?  Да еще должен предвитеть в каком объеме и как эти советы реализовались?

andrej777 пишет:

чем ближе кконцу было дело тем больше становились задержки, 10,15,20,30, ... конец, перестали ваще идти. 
но если комп включен. то идут данные стабильно.

Ну так может дело в вашем роутере?  Или питании, все-таки?
В лог вы выводите? Попытки отсылок регулярны?
Ну разве не логично, если что-то куда-то не приходит, то начинать с того что-бы убедится что "оно отсылается" (хотя-бы пытается)?
Какой ответ получаете от сервера?
Или вы думаете что по цифрам "10,15,20,30" - кто-то сможет "прозреть" и сказать вам причину ваших проблем?

andrej777 пишет:

и ещё вопрос, можно ли данные отсылать  меньше чем 5мин, не забанять?

А почему вы нас об этом спрашиваете?  Спросите владельца сервера которому шлете.... откуда нам знать за что там банят, а за что нет?

Maker39
Offline
Зарегистрирован: 03.10.2014

to andrej777

на основе Вашего кода (не разобрался с какой BMP085 библиотекой Вы собирали, заменил на Adafruit) собрал свою версию. Сутки отпахала как часы (плюс-минус пара минут в логе народмона) через роутер TP-Link MR3420 v.1.0 с родной прошивкой.

Сейчас добавил второй датчик DHT22, посмотрим как срастется.

В планах еще к этому LCD присобачить , во флэш место есть, там посмотрим.

Скетч интересует ?

 

andrej777
Offline
Зарегистрирован: 07.08.2014

Maker39

я уже отказался от модуля этого ENC28J60, сделал на другом. показания стабильны, свободной памяти больше. 

если через роутер идет какой то обмен информации ,то шильд работает отлично, но если после роутера убрать всех, и оставить только ардуину.  шильд засыпал.  как выяснилось, это не только у меня. и по этому я перешёл на 5100 шильд, который мне больше понравился чем тот . 

xorkrus
Offline
Зарегистрирован: 22.09.2013

А у меня не засыпал. Мне все как-то больше памяти не хватало (BMP085, enc28j60, lcd24x2, dht11 dht22, анемометр) :)

andrej777
Offline
Зарегистрирован: 07.08.2014

 

Sketch uses 25 700 bytes (83%) of program storage space. Maximum is 30 720 bytes.
Global variables use 1 172 bytes (57%) of dynamic memory, leaving 876 bytes for local variables. Maximum is 2 048 bytes.
это щас с шильдом 5100, та и то не орчень красиво написан. dht22,1820,BMP085, если по чистить. то можно ещё расшарить. пока необходимости нет. щас надо будет прикрутить, аналоговыфе датчики, на них памяти мало. ну и впринцепи можно 1602 прикрутить.

 

xorkrus
Offline
Зарегистрирован: 22.09.2013

Program:   21726 bytes (66.3%)
Data:       1788 bytes (87.3%)
Да у меня все равно толще...
 

Maker39
Offline
Зарегистрирован: 03.10.2014

andrej777 пишет:

 

Sketch uses 25 700 bytes (83%) of program storage space. Maximum is 30 720 bytes.
Global variables use 1 172 bytes (57%) of dynamic memory, leaving 876 bytes for local variables. Maximum is 2 048 bytes.
 

Научите пожалуйста , как узнать такие подробности :)

Подключил 1602 дисплей , теперь Nano v3+ ENC28J60+2xDHT22+LCD1602 , пока что хотел - все получилось.

С 3.10 фурычит без остановок.

Задался вопросом : почему постоянно горит ACT (желтый светодиод на ENC28) и только в момент передачи данных мигает. Посмотрел в логе роутера, а оказывается постоянно запрашивается DHCP ( скетч из первого поста топика пробовал - без изменений так-же) .

Вопрос к  andrej777 : это специально для чего-то сделано или издержки ?

ps/ только начал изучение , вопросы могут показаться ламерским.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

В IDE включите детальный отчет и будет вам все показывать.

Maker39
Offline
Зарегистрирован: 03.10.2014

Puhlyaviy пишет:
В IDE включите детальный отчет и будет вам все показывать.

версия 1.06  "Настройки-> показывать подробный отчет при компиляции / загрузке "  ?

В логе только "размер скетча" .

Больше ничего похожего не нашел.

xorkrus
Offline
Зарегистрирован: 22.09.2013

Вмешаюсь. Как это в самой ардуине увидеть, я не знаю. Пользуюсь т.с. дедовским способом:

> C:\Program Files (x86)Arduino\hardware\tools\avr\bin>avr-size.exe --mcu=atmega3
28p -d -C "C:\Users\xopek\AppData\Local\Temp\build8348424080955295979.tmp\INT_ML
S_XWS_ETHERCARD.cpp.elf"
AVR Memory Usage
----------------
Device: atmega328p

Program: 21726 bytes (66.3% Full)
(.text + .data + .bootloader)

Data: 1788 bytes (87.3% Full)
(.data + .bss + .noinit)

в CMD выполняем. утилита в составе ардуины есть.  Папка с ельфом - папка где скетч собирается.

andrej777
Offline
Зарегистрирован: 07.08.2014

Maker39 пишет:

andrej777 пишет:

 

Sketch uses 25 700 bytes (83%) of program storage space. Maximum is 30 720 bytes.
Global variables use 1 172 bytes (57%) of dynamic memory, leaving 876 bytes for local variables. Maximum is 2 048 bytes.
 

Научите пожалуйста , как узнать такие подробности :)

 

ардуино иде 1.5.6 http://visualbooster.com/share/20141017094614812.png можно ещё кусок кода вставить и покажет тоже сколько осталось. или иде сама напишет что осталось мало памяти.

 

я отказался от ENC28J60, не стабилен он. взял W5100. меньше памяти ну и плюс флешку можно вставить.

 

xorkrus
Offline
Зарегистрирован: 22.09.2013

andrej777

А подскажите\покажите, пожалуйста свои наработки по W5100. Я что-то не увидел ни капли экономии в сравнении с ENC28J60...