gate nrf24l01+enc28j60

Тема в разделе "Arduino & Shields", создана пользователем dimksum, 11 фев 2015.

  1. dimksum

    dimksum Нерд

    Добрый день.

    Делаю шлюз на данных модулях. Возникли проблемы. Устройство работает через раз, не выполняется php скрипт на сервере. Контроллер собран на Atmega328 c бутлоадером optiboot. Питание на всех мродулях 3.3в 3А, на разьёмах модулей стоят электролиты. Устройство пингутся, отвечает на запрос ?help (значит enc в работе), при поступлении данных по радиоканалу в Serial выводятся соответствующие данные (значит nrf тоже в работе), а скрипт не выполняется :( Если отключить питание, а затем его включить то всё может работать, а может и нет. Незнаю куда копать :(
    Код (Text):

    #include "EtherCard.h"
    #include <string.h>
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    //-----------------------------------------------------------------------------------
    static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    static byte myip[] =  { 192,168,1,99 };  // adress of gate
    static byte gwip[] =  { 192,168,1,20 };
    static byte hisip[] = { 192,168,1,163 }; // adress server
    byte Ethernet::buffer[700];
    static BufferFiller bfill;

    const char PROGMEM webserver[]    = "192.168.1.163";
    RF24 radio(9,8);
    const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

    typedef struct{
      int  NUM;
      int  VCC;
      float TEMP;
      float OTHER;
    }
    B_t;
    B_t data;
    //---------------------ответ серверу--------------------------------------
    void send_http_ok()
    {
      bfill = ether.tcpOffset();
      bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
      ether.httpServerReply(bfill.position());
    }
    //--------------------смотрим ответ от appache ---------------------------------------
    static void my_callback (byte status, word off, word len) {// всё можно закоментировать
      Ethernet::buffer[off+300] = 0;
      Serial.print((const char*) Ethernet::buffer + off);
    }
    //-----------------------------------------------------------
    void setup () {
      Serial.begin(9600);
      Serial.println("Start");
     
      ether.begin(sizeof Ethernet::buffer, mymac,7 );
      ether.staticSetup(myip, gwip);
      ether.copyIp(ether.hisip, hisip);
     
      radio.begin();
      radio.openWritingPipe(pipes[1]);
      radio.openReadingPipe(1,pipes[0]);
      radio.startListening();
    }
    //-----------------------------------------------------------
    void ethernet()
    {
      word pos = ether.packetLoop(ether.packetReceive());
      if(pos)
      {
        parse_str(pos); // parsing comand
        send_http_ok(); // отсылаем стандартный http request !!обязательно
      }
    }
    //-----------------------------------------------------------
    void radioch()
    {
      if ( radio.available() ) // если пришли данные по радио
      {
          radio.read( &data, sizeof(data) );
          char buffer[250];
          char conv_buffer[11];
          buffer[0] = 0;
          strcat_P(buffer, PSTR("n1="));
          strcat(buffer, itoa(data.NUM, conv_buffer, 10));
          strcat_P(buffer, PSTR("&n2="));  
          strcat(buffer, dtostrf(data.VCC, 2, 0, conv_buffer));  
          strcat_P(buffer, PSTR("&n3="));  
          strcat(buffer, dtostrf(data.TEMP, 2, 2, conv_buffer));  
          strcat_P(buffer, PSTR("&n4="));  
          strcat(buffer, dtostrf(data.OTHER, 2, 2, conv_buffer));
          Serial.println(buffer);
          ether.browseUrl(PSTR("/gate.php?"), buffer, webserver, my_callback);
          delay(10);  
    }
    }
    //-----------------------------------------------------------
    void loop ()
    {
      ethernet();
      radioch();
    }
    //---------------------обработки web запросов---------------------------------------
    void parse_str(char pos)
    {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?help") != 0)
      {
      help();
      }
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status") != 0)
      {
      send_status();
      }
    }
    //-----------------------------------------------------------------------------------
    void send_status()
    {
      Serial.print("status...");
      bfill = ether.tcpOffset();
    //  bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"    // $S - значение float  $D - значение int
    //                  "name=street<BR>vcc=$D<BR>temp=$S<P>name=room<BR>vcc=$D<BR>temp=$S"),                              
    //                  obj[1].vcc, dtostrf(obj[1].temp,3,2,tempS), obj[2].vcc, dtostrf(obj[2].temp,3,2,tempS));
      ether.httpServerReply(bfill.position());
    }
    //-----------------------------------------------------------------------------------
    void help()
    {
      Serial.print("Help...");
      bfill = ether.tcpOffset();
      bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n""<p>Last command</p>"));
      ether.httpServerReply(bfill.position());
    }
     
  2. dimksum

    dimksum Нерд

    Неужели никто не знает??!!
     
  3. Arduinщик

    Arduinщик Нерд

    Просто тема появилась на главной страницы Амперке только сейчас.
     
  4. AntonioVT

    AntonioVT Нуб

    Здравствуйте! Разобрались?
     
  5. dimksum

    dimksum Нерд

  6. AntonioVT

    AntonioVT Нуб

    Если не секрет, что не так? Я не пользовался никогда ether.httpServerReply. Отвечал с помощью stash.print /Stash::prepare
     
  7. AntonioVT

    AntonioVT Нуб

    смайлик сам вставился вместо :) и P)
     
  8. AntonioVT

    AntonioVT Нуб

    двоеточия и латинской P
     
  9. dimksum

    dimksum Нерд

    Помогла статья на Хабре. Адрес не помню, смысл такой, что надо слать
    Код (Text):
    ether.packetLoop(ether.packetReceive());
    пока функция
    Код (Text):
    my_callback
    не выполниться. Считаем количество ошибок, перегружаем девайс
     
  10. AntonioVT

    AntonioVT Нуб

    Спасибо за ответ! поищу.
     
  11. dimksum

    dimksum Нерд