Проблема с подключением Arduino по Ethernet.

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Вова_1988
Родился
Сообщения: 14
Зарегистрирован: Вт мар 15, 2016 10:54:25

Проблема с подключением Arduino по Ethernet.

Сообщение Вова_1988 »

Подскажите, пожалуйста, почему в одном скетче для Arduino одновременно не работают эти два фрагмента кода:

Первый:
Спойлер

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

...
void loop()
{
 
// =============
if (client.available())
while (client.connected())
{
  if (client.available())
  {
    char c = client.read();       
    Serial.print(c);
      // =========
      if (c == 'D')
        {
          memset (SECONDS, ' ', 3);
          memset (MINUTES, ' ', 3);
          memset (HOURS, ' ', 3);
          memset (DATE, ' ', 3);
          memset (MOUNTH, ' ', 4);
          memset (YEAR, ' ', 3);
          memset (DAY, ' ', 4);
         
          memset (DATA_STRING,' ',35);
          MARKER_DATA_STRING = true;
          k = 0;
        }
      // =========
        if ((MARKER_DATA_STRING == true) && (k < 36) && (c != 'T'))
        {
          DATA_STRING[k] = c;
          k = k + 1;
        }
      // =========
        if ((MARKER_DATA_STRING == true) && (k >= 36))
        {
          memset (SECONDS, ' ', 3);
          memset (MINUTES, ' ', 3);
          memset (HOURS, ' ', 3);
          memset (DATE, ' ', 3);
          memset (MOUNTH, ' ', 4);
          memset (YEAR, ' ', 3);
          memset (DAY, ' ', 4);
          memset (DATA_STRING, ' ', 35);
          k = 0;
        }
      // =========
        if ((MARKER_DATA_STRING == true) && (c == 'T'))
        {
          DATA_STRING[k] = c;
          MARKER_DATA_STRING = false;
          k = 0;
            // =========
            if (DATA_STRING[29] != '0')
            {
              SECONDS[0] = (DATA_STRING[29]);
              SECONDS[1] = (DATA_STRING[30]);
              SECONDS[2] = ('\0');
            }
            else
            {
              SECONDS[0] = (DATA_STRING[30]);
              SECONDS[1] = ('\0');
            }
            // =========
            if (DATA_STRING[26] != '0')
            {
              MINUTES[0] = (DATA_STRING[26]);
              MINUTES[1] = (DATA_STRING[27]);
              MINUTES[2] = ('\0');
            }
            else
            {
              MINUTES[0] = (DATA_STRING[27]);
              MINUTES[1] = ('\0');
            }
            // =========
            if (DATA_STRING[23] != '0')
            {
              HOURS[0] = (DATA_STRING[23]);
              HOURS[1] = (DATA_STRING[24]);
              HOURS[2] = ('\0');
            }
            else
            {
              HOURS[0] = (DATA_STRING[24]);
              HOURS[1] = ('\0');
            }
            // =========
            if (DATA_STRING[11] != '0')
            {
              DATE[0] = (DATA_STRING[11]);
              DATE[1] = (DATA_STRING[12]);
              DATE[2] = ('\0');
            }
            else
            {
              DATE[0] = (DATA_STRING[12]);
              DATE[1] = ('\0'); 
            }
            // =========
            MOUNTH[0] = (DATA_STRING[14]);
            MOUNTH[1] = (DATA_STRING[15]);
            MOUNTH[2] = (DATA_STRING[16]);
            MOUNTH[3] = ('\0');
           
            if (strncmp (MOUNTH, "Jan", 3) == 0) {MOUNTH_INDEX[0] = '1'; }
            if (strncmp (MOUNTH, "Feb", 3) == 0) {MOUNTH_INDEX[0] = '2'; }
            if (strncmp (MOUNTH, "Mar", 3) == 0) {MOUNTH_INDEX[0] = '3'; }
            if (strncmp (MOUNTH, "Apr", 3) == 0) {MOUNTH_INDEX[0] = '4'; }
            if (strncmp (MOUNTH, "May", 3) == 0) {MOUNTH_INDEX[0] = '5'; }
            if (strncmp (MOUNTH, "Jun", 3) == 0) {MOUNTH_INDEX[0] = '6'; }
            if (strncmp (MOUNTH, "Jul", 3) == 0) {MOUNTH_INDEX[0] = '7'; }
            if (strncmp (MOUNTH, "Aug", 3) == 0) {MOUNTH_INDEX[0] = '8'; }
            if (strncmp (MOUNTH, "Sep", 3) == 0) {MOUNTH_INDEX[0] = '9'; }
            if (strncmp (MOUNTH, "Oct", 3) == 0) {MOUNTH_INDEX[0] = '1'; MOUNTH_INDEX[1] = '0';}
            if (strncmp (MOUNTH, "Nov", 3) == 0) {MOUNTH_INDEX[0] = '1'; MOUNTH_INDEX[1] = '1';}
            if (strncmp (MOUNTH, "Dec", 3) == 0) {MOUNTH_INDEX[0] = '1'; MOUNTH_INDEX[1] = '2';}           

            // =========
            if (DATA_STRING[20] != '0')
            {
              YEAR[0] = (DATA_STRING[20]);
              YEAR[1] = (DATA_STRING[21]);
              YEAR[2] = ('\0');
            }
            else
            {
              YEAR[0] = (DATA_STRING[21]);
              YEAR[1] = ('\0');
            }
            // =========
            DAY[0] = (DATA_STRING[6]);
            DAY[1] = (DATA_STRING[7]);
            DAY[2] = (DATA_STRING[8]);
            DAY[3] = ('\0');

            if (strncmp (DAY, "Mon", 3) == 0) {DAY_INDEX[0] = '1'; }
            if (strncmp (DAY, "Tue", 3) == 0) {DAY_INDEX[0] = '2'; }
            if (strncmp (DAY, "Wed", 3) == 0) {DAY_INDEX[0] = '3'; }
            if (strncmp (DAY, "Thu", 3) == 0) {DAY_INDEX[0] = '4'; }
            if (strncmp (DAY, "Fri", 3) == 0) {DAY_INDEX[0] = '5'; }
            if (strncmp (DAY, "Sat", 3) == 0) {DAY_INDEX[0] = '6'; }
            if (strncmp (DAY, "Sun", 3) == 0) {DAY_INDEX[0] = '7'; }
                       
            // =========           
            time.settime(atoi(SECONDS), atoi(MINUTES), atoi(HOURS), atoi(DATE), atoi(MOUNTH_INDEX), atoi(YEAR), atoi(DAY_INDEX));  // сек, мин, час, число, месяц, год, день недели
            // =========
           
        }       
      // =========
         
    if (!client.connected())
    {
      Serial.println();
      Serial.println("disconnecting.");
      client.stop();
      while (true);
    }
  }
}
...
   


Второй:
Спойлер

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

...
void loop()
{

// =============       
EthernetClient client = server.available();
if (client)
{//Serial.println("new client");
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
               
        // =========
        if (c == '[')
        {
          memset (DATA_PWM,' ',4);
          MARKER_PWM = true;
          i = 0;
          return;
        }
        // =========
        if ((MARKER_PWM == true) && (i < 5) && (c != ']'))
        {
          DATA_PWM[i] = c;
          i = i + 1;
        }
        // =========
        if ((MARKER_PWM == true) && (i >= 5))
        {
          memset (DATA_PWM, ' ', 4);
          i = 0;
        }
        // =========
        if (c == ']')
        {
          MARKER_PWM = false;
          i = 0;
          Serial.println(DATA_PWM);
          client.println(DATA_PWM);
          analogWrite(11, atoi(DATA_PWM));

          myFile = SD.open("DATALOG.txt", FILE_WRITE);
          if (myFile)
          {
            Serial.print("Writing to log file...");
            myFile.print(time.gettime("d-m-Y, H:i:s, D")); // выводим время
            myFile.print(" : Change PWM value to: "); // выводим время
            myFile.println(DATA_PWM);
            myFile.close();
            Serial.println("done."); 
          }
          else
          {
            Serial.println("error opening log file");
          }         
        }
        // =========
      }
    }
}


}

// ===========
   


Весь код:
Спойлер

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

#include <SD.h>
#include <RTC.h>
#include <SPI.h>
#include <Ethernet.h>

// =====
RTC    time;
File myFile;

boolean MARKER_PWM = false;
boolean MARKER_DATA_STRING = false;

char DATA_PWM[4];
char DATA_STRING[35];

char i;
char k;

char SECONDS[3];
char MINUTES[3];
char HOURS[3];
char DATE[3];
char MOUNTH[4];
char YEAR[3];
char DAY[4];

char MOUNTH_INDEX[2];
char DAY_INDEX[1];

// =====

byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
char serv[] = "www.mail.ru";    // name address for Google (using DNS)
EthernetClient client;
EthernetServer server(8888);

// ===========
void setup()

// =====
Serial.begin(9600);

// ========
while (!Serial)
{
  ; // wait for serial port to connect. Needed for native USB port only
}
// ========
 
Serial.print("Initializing SD card...");
pinMode(4, OUTPUT);

if (!SD.begin(4))
{
  Serial.println("initialization failed!");
  return;
}

Serial.println("initialization done.");

// =====
delay(1000);
if (Ethernet.begin(mac) == 0)
{
  Serial.println("Failed to configure Ethernet using DHCP");
  for(;;);
}
Serial.println(Ethernet.localIP());
server.begin();
pinMode(5, OUTPUT);
 
// =====
  delay(300);
  time.begin(RTC_DS1302,2,5,3);  // 10-2, 12-3,13-5
    //time.settime(0,42,14,26,4,16,2);  // сек, мин, час, число, месяц, год, день недели*/
// =====

pinMode(11, OUTPUT);


// =====
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(serv, 80))
  {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.mail.ru");
    client.println("Connection: close");
    client.println();
  }
  else
  {
    Serial.println("connection failed");
  }
// =====



}

// ===========
void loop()
{
 
// =============
if (client.available())
while (client.connected())
{
  if (client.available())
  {
    char c = client.read();       
    Serial.print(c);
      // =========
      if (c == 'D')
        {
          memset (SECONDS, ' ', 3);
          memset (MINUTES, ' ', 3);
          memset (HOURS, ' ', 3);
          memset (DATE, ' ', 3);
          memset (MOUNTH, ' ', 4);
          memset (YEAR, ' ', 3);
          memset (DAY, ' ', 4);
         
          memset (DATA_STRING,' ',35);
          MARKER_DATA_STRING = true;
          k = 0;
        }
      // =========
        if ((MARKER_DATA_STRING == true) && (k < 36) && (c != 'T'))
        {
          DATA_STRING[k] = c;
          k = k + 1;
        }
      // =========
        if ((MARKER_DATA_STRING == true) && (k >= 36))
        {
          memset (SECONDS, ' ', 3);
          memset (MINUTES, ' ', 3);
          memset (HOURS, ' ', 3);
          memset (DATE, ' ', 3);
          memset (MOUNTH, ' ', 4);
          memset (YEAR, ' ', 3);
          memset (DAY, ' ', 4);
          memset (DATA_STRING, ' ', 35);
          k = 0;
        }
      // =========
        if ((MARKER_DATA_STRING == true) && (c == 'T'))
        {
          DATA_STRING[k] = c;
          MARKER_DATA_STRING = false;
          k = 0;
            // =========
            if (DATA_STRING[29] != '0')
            {
              SECONDS[0] = (DATA_STRING[29]);
              SECONDS[1] = (DATA_STRING[30]);
              SECONDS[2] = ('\0');
            }
            else
            {
              SECONDS[0] = (DATA_STRING[30]);
              SECONDS[1] = ('\0');
            }
            // =========
            if (DATA_STRING[26] != '0')
            {
              MINUTES[0] = (DATA_STRING[26]);
              MINUTES[1] = (DATA_STRING[27]);
              MINUTES[2] = ('\0');
            }
            else
            {
              MINUTES[0] = (DATA_STRING[27]);
              MINUTES[1] = ('\0');
            }
            // =========
            if (DATA_STRING[23] != '0')
            {
              HOURS[0] = (DATA_STRING[23]);
              HOURS[1] = (DATA_STRING[24]);
              HOURS[2] = ('\0');
            }
            else
            {
              HOURS[0] = (DATA_STRING[24]);
              HOURS[1] = ('\0');
            }
            // =========
            if (DATA_STRING[11] != '0')
            {
              DATE[0] = (DATA_STRING[11]);
              DATE[1] = (DATA_STRING[12]);
              DATE[2] = ('\0');
            }
            else
            {
              DATE[0] = (DATA_STRING[12]);
              DATE[1] = ('\0'); 
            }
            // =========
            MOUNTH[0] = (DATA_STRING[14]);
            MOUNTH[1] = (DATA_STRING[15]);
            MOUNTH[2] = (DATA_STRING[16]);
            MOUNTH[3] = ('\0');
           
            if (strncmp (MOUNTH, "Jan", 3) == 0) {MOUNTH_INDEX[0] = '1'; }
            if (strncmp (MOUNTH, "Feb", 3) == 0) {MOUNTH_INDEX[0] = '2'; }
            if (strncmp (MOUNTH, "Mar", 3) == 0) {MOUNTH_INDEX[0] = '3'; }
            if (strncmp (MOUNTH, "Apr", 3) == 0) {MOUNTH_INDEX[0] = '4'; }
            if (strncmp (MOUNTH, "May", 3) == 0) {MOUNTH_INDEX[0] = '5'; }
            if (strncmp (MOUNTH, "Jun", 3) == 0) {MOUNTH_INDEX[0] = '6'; }
            if (strncmp (MOUNTH, "Jul", 3) == 0) {MOUNTH_INDEX[0] = '7'; }
            if (strncmp (MOUNTH, "Aug", 3) == 0) {MOUNTH_INDEX[0] = '8'; }
            if (strncmp (MOUNTH, "Sep", 3) == 0) {MOUNTH_INDEX[0] = '9'; }
            if (strncmp (MOUNTH, "Oct", 3) == 0) {MOUNTH_INDEX[0] = '1'; MOUNTH_INDEX[1] = '0';}
            if (strncmp (MOUNTH, "Nov", 3) == 0) {MOUNTH_INDEX[0] = '1'; MOUNTH_INDEX[1] = '1';}
            if (strncmp (MOUNTH, "Dec", 3) == 0) {MOUNTH_INDEX[0] = '1'; MOUNTH_INDEX[1] = '2';}           

            // =========
            if (DATA_STRING[20] != '0')
            {
              YEAR[0] = (DATA_STRING[20]);
              YEAR[1] = (DATA_STRING[21]);
              YEAR[2] = ('\0');
            }
            else
            {
              YEAR[0] = (DATA_STRING[21]);
              YEAR[1] = ('\0');
            }
            // =========
            DAY[0] = (DATA_STRING[6]);
            DAY[1] = (DATA_STRING[7]);
            DAY[2] = (DATA_STRING[8]);
            DAY[3] = ('\0');

            if (strncmp (DAY, "Mon", 3) == 0) {DAY_INDEX[0] = '1'; }
            if (strncmp (DAY, "Tue", 3) == 0) {DAY_INDEX[0] = '2'; }
            if (strncmp (DAY, "Wed", 3) == 0) {DAY_INDEX[0] = '3'; }
            if (strncmp (DAY, "Thu", 3) == 0) {DAY_INDEX[0] = '4'; }
            if (strncmp (DAY, "Fri", 3) == 0) {DAY_INDEX[0] = '5'; }
            if (strncmp (DAY, "Sat", 3) == 0) {DAY_INDEX[0] = '6'; }
            if (strncmp (DAY, "Sun", 3) == 0) {DAY_INDEX[0] = '7'; }
                       
            // =========           
            time.settime(atoi(SECONDS), atoi(MINUTES), atoi(HOURS), atoi(DATE), atoi(MOUNTH_INDEX), atoi(YEAR), atoi(DAY_INDEX));  // сек, мин, час, число, месяц, год, день недели
            // =========
           
        }       
      // =========
         
    if (!client.connected())
    {
      Serial.println();
      Serial.println("disconnecting.");
      client.stop();
      while (true);
    }
  }
}

// =============       
EthernetClient client = server.available();
if (client)
{//Serial.println("new client");
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
               
        // =========
        if (c == '[')
        {
          memset (DATA_PWM,' ',4);
          MARKER_PWM = true;
          i = 0;
          return;
        }
        // =========
        if ((MARKER_PWM == true) && (i < 5) && (c != ']'))
        {
          DATA_PWM[i] = c;
          i = i + 1;
        }
        // =========
        if ((MARKER_PWM == true) && (i >= 5))
        {
          memset (DATA_PWM, ' ', 4);
          i = 0;
        }
        // =========
        if (c == ']')
        {
          MARKER_PWM = false;
          i = 0;
          Serial.println(DATA_PWM);
          client.println(DATA_PWM);
          analogWrite(11, atoi(DATA_PWM));

          myFile = SD.open("DATALOG.txt", FILE_WRITE);
          if (myFile)
          {
            Serial.print("Writing to log file...");
            myFile.print(time.gettime("d-m-Y, H:i:s, D")); // выводим время
            myFile.print(" : Change PWM value to: "); // выводим время
            myFile.println(DATA_PWM);
            myFile.close();
            Serial.println("done."); 
          }
          else
          {
            Serial.println("error opening log file");
          }         
        }
        // =========
      }
    }
}


}

// ===========
   


Подключение проходит, IP-адрес получаем,ответ на GET-запрос тоже получаем. Но в таком случае не работает соединение с терминалом.
Аватара пользователя
NeiroN
Родился
Сообщения: 14
Зарегистрирован: Сб янв 09, 2016 23:58:44
Контактная информация:

Re: Проблема с подключением Arduino по Ethernet.

Сообщение NeiroN »

Проблема в том что вы пытаетесь обработать поочередно события которые происходят одновременно. Вам нужно одновременно обрабатывать и прием данных с веб и работу с подключением к ардуине. Работа должна быть организованна так: получили байт от сервера mail.ru - обработали его, получили байт от клиента подключившегося к ардуине - обработали его.

Вообще в loop нельзя использовать while - так как получится вложенный while.

Думаю достаточно будет убрать while циклы:
if(avalible)while(connected){}
Ответить

Вернуться в «Интеграция с ПК»