Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение dmw » Вт окт 15, 2013 9:45 pm

У меня с такими масками настроено и работает:
28E69A5C040000DB:(.+?);
2861DF5C0400008F:(.+?);
и т.д.
Konstantin
Сообщения: 2
Зарегистрирован: Вт окт 15, 2013 6:25 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение Konstantin » Чт окт 17, 2013 5:17 am

Проблема с чтением датчиков решилась установкой времени обновления в 0. Стоит выставить другое значение - выдаются данные только с одного датчика. Похоже не успевает отработать цикл.
tammat
Сообщения: 165
Зарегистрирован: Пт янв 20, 2012 3:05 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение tammat » Чт окт 17, 2013 9:16 pm

Добрый день, коллеги!
Нашел интересный скетч по чтению датчиков Oregon и других протоколов на 433МГЦ
Читает и noolight и прочие китайские штуки.
arduino.ru

Код: Выделить всё

// Oregon V2 decoder added - Dominique Pierre
// Oregon V3 decoder revisited - Dominique Pierre
// New code to decode OOK signals from weather sensors, etc.
// 2010-04-11 <jcw@equi4.com> <a data-cke-saved-href="<a href="http://opensource.org/licenses/mit-license.php" rel="nofollow">http://opensource.org/licenses/mit-license.php</a>" href="<a href="http://opensource.org/licenses/mit-license.php" rel="nofollow">http://opensource.org/licenses/mit-license.php</a>" rel="nofollow"><a href="http://opensource.org/licenses/mit-license.php" rel="nofollow">http://opensource.org/licenses/mit-license.php</a></a>
// $Id: ookDecoder.pde 5331 2010-04-17 10:45:17Z jcw $

class DecodeOOK {
protected:
    byte total_bits, bits, flip, state, pos, data[25];

    virtual char decode (word width) =0;
    
public:

    enum { UNKNOWN, T0, T1, T2, T3, OK, DONE };

    DecodeOOK () { resetDecoder(); }

    bool nextPulse (word width) {
        if (state != DONE)
        
            switch (decode(width)) {
                case -1: resetDecoder(); break;
                case 1:  done(); break;
            }
        return isDone();
    }
    
    bool isDone () const { return state == DONE; }

    const byte* getData (byte& count) const {
        count = pos;
        return data; 
    }
    
    void resetDecoder () {
        total_bits = bits = pos = flip = 0;
        state = UNKNOWN;
    }
    
    // add one bit to the packet data buffer
    
    virtual void gotBit (char value) {
        total_bits++;
        byte *ptr = data + pos;
        *ptr = (*ptr >> 1) | (value << 7);

        if (++bits >= 8) {
            bits = 0;
            if (++pos >= sizeof data) {
                resetDecoder();
                return;
            }
        }
        state = OK;
    }
    
    // store a bit using Manchester encoding
    void manchester (char value) {
        flip ^= value; // manchester code, long pulse flips the bit
        gotBit(flip);
    }
    
    // move bits to the front so that all the bits are aligned to the end
    void alignTail (byte max =0) {
        // align bits
        if (bits != 0) {
            data[pos] >>= 8 - bits;
            for (byte i = 0; i < pos; ++i)
                data[i] = (data[i] >> bits) | (data[i+1] << (8 - bits));
            bits = 0;
        }
        // optionally shift bytes down if there are too many of 'em
        if (max > 0 && pos > max) {
            byte n = pos - max;
            pos = max;
            for (byte i = 0; i < pos; ++i)
                data[i] = data[i+n];
        }
    }
    
    void reverseBits () {
        for (byte i = 0; i < pos; ++i) {
            byte b = data[i];
            for (byte j = 0; j < 8; ++j) {
                data[i] = (data[i] << 1) | (b & 1);
                b >>= 1;
            }
        }
    }
    
    void reverseNibbles () {
        for (byte i = 0; i < pos; ++i)
            data[i] = (data[i] << 4) | (data[i] >> 4);
    }
    
    void done () {
        while (bits)
            gotBit(0); // padding
        state = DONE;
    }
};

// 433 MHz decoders


class OregonDecoderV2 : public DecodeOOK {
public:
    OregonDecoderV2() {}
    
    // add one bit to the packet data buffer
    virtual void gotBit (char value) {
        if(!(total_bits & 0x01))
        {
            data[pos] = (data[pos] >> 1) | (value ? 0x80 : 00);
        }
        total_bits++;
        pos = total_bits >> 4;
        if (pos >= sizeof data) {
            resetDecoder();
            return;
        }
        state = OK;
    }
    
    virtual char decode (word width) {
        if (200 <= width && width < 1200) {
            byte w = width >= 700;
            switch (state) {
                case UNKNOWN:
                    if (w != 0) {
                        // Long pulse
                        ++flip;
                    } else if (32 <= flip) {
                        // Short pulse, start bit
                        flip = 0;
                        state = T0;
                    } else {
                      // Reset decoder
                        return -1;
                    }
                    break;
                case OK:
                    if (w == 0) {
                        // Short pulse
                        state = T0;
                    } else {
                        // Long pulse
                        manchester(1);
                    }
                    break;
                case T0:
                    if (w == 0) {
                      // Second short pulse
                        manchester(0);
                    } else {
                        // Reset decoder
                        return -1;
                    }
                    break;
            }
        } else {
            return -1;
        }
        return total_bits == 160 ? 1: 0;
    }
};

class OregonDecoderV3 : public DecodeOOK {
public:
    OregonDecoderV3() {}
    
    // add one bit to the packet data buffer
    virtual void gotBit (char value) {
        data[pos] = (data[pos] >> 1) | (value ? 0x80 : 00);
        total_bits++;
        pos = total_bits >> 3;
        if (pos >= sizeof data) {
            resetDecoder();
            return;
        }
        state = OK;
    }
    
    virtual char decode (word width) {
        if (200 <= width && width < 1200) {
            byte w = width >= 700;
            switch (state) {
                case UNKNOWN:
                    if (w == 0)
                        ++flip;
                    else if (32 <= flip) {
                        flip = 1;
                        manchester(1);
                    } else
                        return -1;
                    break;
                case OK:
                    if (w == 0)
                        state = T0;
                    else
                        manchester(1);
                    break;
                case T0:
                    if (w == 0)
                        manchester(0);
                    else
                        return -1;
                    break;
            }
        } else {
            return -1;
        }
        return  total_bits == 80 ? 1: 0;
    }
};

class CrestaDecoder : public DecodeOOK {
public:
    CrestaDecoder () {}
    
    virtual char decode (word width) {
        if (200 <= width && width < 1300) {
            byte w = width >= 750;
            switch (state) {
                case UNKNOWN:
                    if (w == 1)
                        ++flip;
                    else if (2 <= flip && flip <= 10)
                        state = T0;
                    else
                        return -1;
                    break;
                case OK:
                    if (w == 0)
                        state = T0;
                    else
                        gotBit(1);
                    break;
                case T0:
                    if (w == 0)
                        gotBit(0);
                    else
                        return -1;
                    break;
            }
        } else if (width >= 2500 && pos >= 7) 
            return 1;
        else
            return -1;
        return 0;
    }
};

class KakuDecoder : public DecodeOOK {
public:
    KakuDecoder () {}
    
    virtual char decode (word width) {
        if (180 <= width && width < 450 || 950 <= width && width < 1250) {
            byte w = width >= 700;
            switch (state) {
                case UNKNOWN:
                case OK:
                    if (w == 0)
                        state = T0;
                    else
                        return -1;
                    break;
                case T0:
                    if (w)
                        state = T1;
                    else
                        return -1;
                    break;
                case T1:
                    state += w + 1;
                    break;
                case T2:
                    if (w)
                        gotBit(0);
                    else
                        return -1;
                    break;
                case T3:
                    if (w == 0)
                        gotBit(1);
                    else
                        return -1;
                    break;
            }
        } else if (width >= 2500 && 8 * pos + bits == 12) {
            for (byte i = 0; i < 4; ++i)
                gotBit(0);
            alignTail(2);
            return 1;
        } else
            return -1;
        return 0;
    }
};

class XrfDecoder : public DecodeOOK {
public:
    XrfDecoder () {}
    
    // see also <a data-cke-saved-href="<a href="http://davehouston.net/rf.htm" rel="nofollow">http://davehouston.net/rf.htm</a>" href="<a href="http://davehouston.net/rf.htm" rel="nofollow">http://davehouston.net/rf.htm</a>" rel="nofollow"><a href="http://davehouston.net/rf.htm" rel="nofollow">http://davehouston.net/rf.htm</a></a>
    virtual char decode (word width) {
        if (width > 2000 && pos >= 4)
            return 1;
        if (width > 5000)
            return -1;
        if (width > 4000 && state == UNKNOWN)
            state = OK;
        else if (350 <= width && width < 1800) {
            byte w = width >= 720;
            switch (state) {
                case OK:
                    if (w == 0)
                        state = T0;
                    else
                        return -1;
                    break;
                case T0:
                    gotBit(w);
                    break;
            }
        } else
            return -1;
        return 0;
    }
};

class HezDecoder : public DecodeOOK {
public:
    HezDecoder () {}
    
    // see also <a data-cke-saved-href="<a href="http://homeeasyhacking.wikia.com/wiki/Home_Easy_Hacking_Wiki" rel="nofollow">http://homeeasyhacking.wikia.com/wiki/Home_Easy_Hacking_Wiki</a>" href="<a href="http://homeeasyhacking.wikia.com/wiki/Home_Easy_Hacking_Wiki" rel="nofollow">http://homeeasyhacking.wikia.com/wiki/Home_Easy_Hacking_Wiki</a>" rel="nofollow"><a href="http://homeeasyhacking.wikia.com/wiki/Home_Easy_Hacking_Wiki" rel="nofollow">http://homeeasyhacking.wikia.com/wiki/Home_Easy_Hacking_Wiki</a></a>
    virtual char decode (word width) {
        if (200 <= width && width < 1200) {
            byte w = width >= 600;
            gotBit(w);
        } else if (width >= 5000 && pos >= 5 /*&& 8 * pos + bits == 50*/) {
            for (byte i = 0; i < 6; ++i)
                gotBit(0);
            alignTail(7); // keep last 56 bits
            return 1;
        } else
            return -1;
        return 0;
    }
};

// 868 MHz decoders

class VisonicDecoder : public DecodeOOK {
public:
    VisonicDecoder () {}
    
    virtual char decode (word width) {
        if (200 <= width && width < 1000) {
            byte w = width >= 600;
            switch (state) {
                case UNKNOWN:
                case OK:
                    state = w == 0 ? T0 : T1;
                    break;
                case T0:
                    gotBit(!w);
                    if (w)
                        return 0;
                    break;
                case T1:
                    gotBit(!w);
                    if (!w)
                        return 0;
                    break;
            }
            // sync error, flip all the preceding bits to resync
            for (byte i = 0; i <= pos; ++i)
                data[i] ^= 0xFF; 
        } else if (width >= 2500 && 8 * pos + bits >= 36 && state == OK) {
            for (byte i = 0; i < 4; ++i)
                gotBit(0);
            alignTail(5); // keep last 40 bits
            // only report valid packets
            byte b = data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4];
            if ((b & 0xF) == (b >> 4))
                return 1;
        } else
            return -1;
        return 0;
    }
};

class EMxDecoder : public DecodeOOK {
public:
    EMxDecoder () {}
    
    // see also <a data-cke-saved-href="<a href="http://fhz4linux.info/tiki-index.php?page=EM+Protocol" rel="nofollow">http://fhz4linux.info/tiki-index.php?page=EM+Protocol</a>" href="<a href="http://fhz4linux.info/tiki-index.php?page=EM+Protocol" rel="nofollow">http://fhz4linux.info/tiki-index.php?page=EM+Protocol</a>" rel="nofollow"><a href="http://fhz4linux.info/tiki-index.php?page=EM+Protocol" rel="nofollow">http://fhz4linux.info/tiki-index.php?page=EM+Protocol</a></a>
    virtual char decode (word width) {
        if (200 <= width && width < 1000) {
            byte w = width >= 600;
            switch (state) {
                case UNKNOWN:
                    if (w == 0)
                        ++flip;
                    else if (flip > 20)
                        state = OK;
                    else
                        return -1;
                    break;
                case OK:
                    if (w == 0)
                        state = T0;
                    else
                        return -1;
                    break;
                case T0:
                    gotBit(w);
                    break;
            }
        } else if (width >= 1500 && pos >= 9)
            return 1;
        else
            return -1;
        return 0;
    }
};

class KSxDecoder : public DecodeOOK {
public:
    KSxDecoder () {}
    
    // see also <a data-cke-saved-href="<a href="http://www.dc3yc.homepage.t-online.de/protocol.htm" rel="nofollow">http://www.dc3yc.homepage.t-online.de/protocol.htm</a>" href="<a href="http://www.dc3yc.homepage.t-online.de/protocol.htm" rel="nofollow">http://www.dc3yc.homepage.t-online.de/protocol.htm</a>" rel="nofollow"><a href="http://www.dc3yc.homepage.t-online.de/protocol.htm" rel="nofollow">http://www.dc3yc.homepage.t-online.de/protocol.htm</a></a>
    virtual char decode (word width) {
        if (200 <= width && width < 1000) {
            byte w = width >= 600;
            switch (state) {
                case UNKNOWN:
                    gotBit(w);
                    bits = pos = 0;
                    if (data[0] != 0x95)
                        state = UNKNOWN;
                    break;
                case OK:
                    state = w == 0 ? T0 : T1;
                    break;
                case T0:
                    gotBit(1);
                    if (!w)
                        return -1;
                    break;
                case T1:
                    gotBit(0);
                    if (w)
                        return -1;
                    break;
            }
        } else if (width >= 1500 && pos >= 6) 
            return 1;
        else
            return -1;
        return 0;
    }
};

class FSxDecoder : public DecodeOOK {
public:
    FSxDecoder () {}
    
    // see also <a data-cke-saved-href="<a href="http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol" rel="nofollow">http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol</a>" href="<a href="http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol" rel="nofollow">http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol</a>" rel="nofollow"><a href="http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol" rel="nofollow">http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol</a></a>
    virtual char decode (word width) {
        if (300 <= width && width < 775) {
            byte w = width >= 500;
            switch (state) {
                case UNKNOWN:
                    if (w == 0)
                        ++flip;
                    else if (flip > 20)
                        state = T1;
                    else
                        return -1;
                    break;
                case OK:
                    state = w == 0 ? T0 : T1;
                    break;
                case T0:
                    gotBit(0);
                    if (w)
                        return -1;
                    break;
                case T1:
                    gotBit(1);
                    if (!w)
                        return -1;
                    break;
            }
        } else if (width >= 1500 && pos >= 5)
            return 1;
        else
            return -1;
        return 0;
    }
};

OregonDecoderV2 orscV2;
OregonDecoderV3 orscV3;
CrestaDecoder cres;
KakuDecoder kaku;
XrfDecoder xrf;
HezDecoder hez;
VisonicDecoder viso;
EMxDecoder emx;
KSxDecoder ksx;
FSxDecoder fsx;

#define PORT 2

volatile word pulse;

#if defined(__AVR_ATmega1280__)
void ext_int_1(void) {
#else
ISR(ANALOG_COMP_vect) {
#endif
    static word last;
    // determine the pulse length in microseconds, for either polarity
    pulse = micros() - last;
    last += pulse;
}

void reportSerial (const char* s, class DecodeOOK& decoder) {
    byte pos;
    const byte* data = decoder.getData(pos);
    Serial.print(s);
    Serial.print(' ');
    for (byte i = 0; i < pos; ++i) {
        Serial.print(data[i] >> 4, HEX);
        Serial.print(data[i] & 0x0F, HEX);
    }
    
    // Serial.print(' ');
    // Serial.print(millis() / 1000);
    Serial.println();
    
    decoder.resetDecoder();
}


void setup () {
    Serial.begin(115200);
    Serial.println("\n[ookDecoder]");
    
#if !defined(__AVR_ATmega1280__)
    pinMode(13 + PORT, INPUT);  // use the AIO pin
    digitalWrite(13 + PORT, 1); // enable pull-up

    // use analog comparator to switch at 1.1V bandgap transition
    ACSR = _BV(ACBG) | _BV(ACI) | _BV(ACIE);

    // set ADC mux to the proper port
    ADCSRA &= ~ bit(ADEN);
    ADCSRB |= bit(ACME);
    ADMUX = PORT - 1;
#else
   attachInterrupt(1, ext_int_1, CHANGE);

   DDRE  &= ~_BV(PE5);
   PORTE &= ~_BV(PE5);
#endif
}

void loop () {
    static int i = 0;
    cli();
    word p = pulse;
    
    pulse = 0;
    sei();

    //if (p != 0){ Serial.print(++i); Serial.print('\n');}
    
    if (p != 0) {
        if (orscV2.nextPulse(p))
            reportSerial("OSV2", orscV2);  
        if (orscV3.nextPulse(p))
            reportSerial("OSV3", orscV3);        
        if (cres.nextPulse(p))
            reportSerial("CRES", cres);        
        if (kaku.nextPulse(p))
            reportSerial("KAKU", kaku);        
        if (xrf.nextPulse(p))
            reportSerial("XRF", xrf);        
        if (hez.nextPulse(p))
            reportSerial("HEZ", hez);        
    }

    if (p != 0) {
        if (viso.nextPulse(p))
            reportSerial("VISO", viso);        
        if (emx.nextPulse(p))
            reportSerial("EMX", emx);        
        if (ksx.nextPulse(p))
            reportSerial("KSX", ksx);        
        if (fsx.nextPulse(p))
            reportSerial("FSX", fsx);        
    }
}

Не могу разобраться как сделать, чтобы скетч отдавал на в COM-port, а на сервер...
Это выдает с передатчика noolight

Код: Выделить всё

HEZ: HEX: 04000200004C02
HEZ: HEX: 000200C04C00
Аналогично с Oregon'овcких датчиков и китайских беспроводных датчиков.
И совместить все это с предыдущим скетчем.
Как сделать чтобы функция reportSerial() сохранял данные в глобальных переменных чтобы их можно использовать в дальнейшем.
Спасибо.
Последний раз редактировалось tammat Сб окт 19, 2013 8:18 pm, всего редактировалось 8 раз.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение LutsenkoDenis » Пт окт 18, 2013 6:26 pm

tammat писал(а): Как сделать чтобы функция reportSerial() сохранял данные в глобальных переменных чтобы их можно использовать в дальнейшем.
Спасибо.
Ну, судя по названию данная функция нужна для вывода в сериал порт информации. И пихать в неё еще какой-то функционал не вижу смысла, но можно конечно.

Если нужно чтобы reportSerial что-то еще делал кроме вывода в порт, то нужно или внутрь этой функции вписывать нужный функционал, или сделать так чтобы reportSerial возвращала данные.
И потом уже эти данные обрабатывать и что-то с ними делать.

Я, для своего орегоновского датчика, внутри reportSerial формирую строку с параметрами для передачи на сервер и возваращаю их.
Результат выполнения reportSerial скармливаю функции которая отправляет данные на сервак.
Пример loop()

Код: Выделить всё

void loop() 
{
   static int i = 0;
   cli();
   word p = pulse;
 
   pulse = 0;
   sei();
 
   if (p != 0)
   {
      if (orscV2.nextPulse(p))
      {
         // получаем подготовленные к передаче на сервер данные
         String vData = reportSerial("OSV2", orscV2); 
         // если данные есть, то передаём
         if (vData != "")
         {
            // подключаемся к серверу и передаём данные
            PostTemperatureDataToServer(vData);
         }
      }
   }
}
 
p.s. Есть пара предложений.
1. Огромная просьба писать вместо [ code] [ code=php], примеры читаются удобней когда не весь код зелёным цветом.
2. Давайте выкладывать куда-ниудь опиcание работы с устройствами. Т.е пошаговую инструкцию как прикручивается к мажордому. С картинками, скетчами и т.д. Пример http://silvergate.ru/Download/OregonTem ... ar339P.pdf. До прикручивания именно к MDM руки еще не дошли, но думаю что не сложно.
На выходных постараюсь подготовить инструкцию к своему датчику.
Последний раз редактировалось LutsenkoDenis Пт окт 18, 2013 11:50 pm, всего редактировалось 1 раз.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение LutsenkoDenis » Пт окт 18, 2013 7:19 pm

и я тут немного не понял что это за конструкция такая:

Код: Выделить всё

#if !defined(__AVR_ATmega1280__)
#else
#endif
 
Что означает решетка?
Код вообще рабочий???
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
tammat
Сообщения: 165
Зарегистрирован: Пт янв 20, 2012 3:05 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение tammat » Сб окт 19, 2013 7:56 pm

Спасибо.
Я выложил оригинальный скетч с arduino.ru.
у себя я оставил только

Код: Выделить всё

  
   attachInterrupt(1, ext_int_1, CHANGE);
   DDRE  &= ~_BV(PE5);
   PORTE &= ~_BV(PE5);
 
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение Ivan » Сб окт 19, 2013 8:58 pm

Я предложил бы сделать wiki где все могут писать и дополнять статьи.
Очень быстро сделали полноценную документацию и рекомендации.
Ато очень трудно выискивать решения в форуме и отдельных статьях на сайте на которые ещё выйти трудно
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
tammat
Сообщения: 165
Зарегистрирован: Пт янв 20, 2012 3:05 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение tammat » Вс окт 20, 2013 6:30 am

Добрый день, коллеги!
Возможно ли в одном скетче использовать и контролер, и WEB Server (от уважаемого serg009).
Зачем это нужно в одном скетче?
1. Online передача данных по изменению данных на arduino на MDM.
2. Возможность изменять свойства входов/выходов, выполнять какие-то действия на arduino(Управление RF передатчиками, приборами и т.д.), получать и изменять их по запросу от MDM.
@LutsenkoDenis
Как из функции ReportSerial получить строку "OSV2:df00aaa88888f", где OSV2=df00aaa88888f=data, 16-код, получаемый RF-приемником.
Что-то не разберусь никак. а разборку кода проводить уже на сервере MDM
Как преобразовать полученный код (data) в текстовую строку???
Спасибо
@Ivan
Лучше оформить весь накопленный опыт в библиотеки для arduino, ну и wiki к ней
tammat
Сообщения: 165
Зарегистрирован: Пт янв 20, 2012 3:05 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение tammat » Вс окт 20, 2013 10:26 am

Добрый день, коллеги!
Подскажите данные уходят, но в MDM не свойства не появляются
Куски кода

Код: Выделить всё

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE4, 0xDE, 0x35 }; // MAC-адрес нашего устройства
byte ip[] = { 10, 0, 1, 21};
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = {10, 0, 1, 1 };
byte dns_server[] = { 10, 0, 1, 1 };
// ip-адрес удалённого сервера
byte rserver[] = { 10, 0, 1, 7 };//
 

Код: Выделить всё

sprintf(buf, "GET objects/?object=ExtDoor&op=set&p=humidity&v=%d",humidity(data));
sendHTTPRequest();
sprintf(buf, "GET objects/?object=ExtDoor&op=set&p=temp&v=%d",temperature(data));
sendHTTPRequest();
sprintf(buf, "GET objects/?object=ExtDoor&op=set&p=battery&v=%d",battery(data));
sendHTTPRequest();
  }
 

Код: Выделить всё

/***********************************************************************************/
void sendHTTPRequest() {
  Serial.println(buf); 
  if (rclient.connect(rserver, 80)) { 
   Serial.println("Data sended...Ok"); 
   rclient.print(buf);
   rclient.println(" HTTP/1.0");
   rclient.print("Host: ");
   sprintf(ipbuff, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
   Serial.print("IP Arduino:");
   Serial.print(ipbuff);
   rclient.println(ipbuff); // ip адрес нашего контроллера в текстовом виде
   rclient.print("Content-Type: text/html\n");
   rclient.println("Connection: close\n");
   delay(2000);
   rclient.stop();
  } else {
   Serial.println("FAILED");     
  }
} 
В Serial вижу

Код: Выделить всё

GET objects/?object=ExtDoor&op=set&p=humidity&v=34
Data sended...Ok
GET objects/?object=ExtDoor&op=set&p=temp&v=-26214
Data sended...Ok
GET objects/?object=ExtDoor&op=set&p=battery&v=90
Data sended...Ok
Но данные до сервера не доходят....
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение LutsenkoDenis » Пн окт 21, 2013 5:25 pm

У меня была похожая проблема с отправкой.
У тебя в коде есть код который выводит в com-порт данные, причём без проверки соединения с портом.
Собственно, ардуина сидит и ждет соединения с ком-портом.
Либо убери вывод в порт либо оберни их проверкой.

Код: Выделить всё

if (Serial.available()) { // print }   
Если что, см. pdf-ник, который я ранее прикладывал к сообщению. Там это есть.

з.ы. Это то, что было у меня.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Ответить