Проблема получения данных с серийного порта Arduino

jkeeeng
Offline
Зарегистрирован: 01.09.2013

Доброго время суток! 



Работаю над небольшим проектом мониторинга состояний окружающей среды... Он состоит из 4-х Ардуин, 3 из которых занимаются сбором данных с различных сенсоров и по запросу передают по серийному порту на 4-ую Ардуину. Данные с сенсоров по серийному идут в формате состоящем из 2-4 чисел (в зависимости от датчика). Например "1234" без лишних запятых, букв и тд. Идут они раздельно с интерввалом в 5 секунд. Задача состоит в том чтоб считать эти данные также раздельно и целиком а не по-битно... Т.к. данные я получаю, но лишь один бит из нескольких в формате ASCII. Я перерыл весь интернет, перепробывал кучу всяких кодов, но все никак...может кто-то сталкивался или может помоч? 

Заранее благодарен!



Вот пример кода:



Serial.write('R'); //запрашиваем данные с датчика дождя

if(Serial.available() > 0)

{

rain = Serial.read(); //считываем данные

delay(50);

lcd.setCursor(-4, 2); //выводим на дисплей

lcd.print("Rain: ");

lcd.print(rain);

lcd.print(" ");

delay(50);

dataString += "\nrain,"; //отслылаем на сервер Pachube.com

dataString += rain;

}

delay(2000);





З.Ы. Данные с датчиков приходят в нормальном виде, но не распознаются правильно уже самой Ардуиной. Проверено используя Tera Term терминал напрямую к серийному порту 4-ой Ардуины...

maksim
Offline
Зарегистрирован: 12.02.2012

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

http://arduino.ru/forum/programmirovanie/upravlenie-servoprivodom-po-serial

 

jkeeeng
Offline
Зарегистрирован: 01.09.2013

Данные отсылаются скорее всего в ASCII... отсылаются с 1ой Ардуины на 4ую при помощи команды:

Serial.println(sens_temp);     //к примеру, где sens_temp = 1204

На другом конце принимаются в таком же виде "1204", проверено при помощи монитора серийного порта. Но самой ардуиной не получаются они целым числом. Пробовал и в массив загнать и Serial.readBytesUntil() функции и все никак... 

maksim
Offline
Зарегистрирован: 12.02.2012

Что не понятно из #1 поста?

jkeeeng
Offline
Зарегистрирован: 01.09.2013

Да чесное слово многое... посмотрел я ту ветку на форуме и всеравно нечего не получается. У меня немного другой случай или я что-то делаю не так

maksim
Offline
Зарегистрирован: 12.02.2012

Случай у вас именно тот.

Serial.write('R'); //запрашиваем данные с датчика дождя

if(Serial.available()) 
{
  int rain = Serial.parseInt(); //считываем данные
  delay(50);
  lcd.setCursor(-4, 2); //выводим на дисплей
  lcd.print("Rain: ");
  lcd.print(rain);
  lcd.print(" ");
  delay(50);
  dataString += "\nrain,"; //отслылаем на сервер Pachube.com
  dataString += rain;
}
delay(2000);

 

jkeeeng
Offline
Зарегистрирован: 01.09.2013

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

Вот собвственно сам метод:
 

 Serial.write('H');
  delay(500);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 1);
      lcd.print("Humidity:    ");
      lcd.print(inString);
      lcd.print("%");
      delay(50);
      dataString += "\nhum,";
      dataString += inString;
    }
  }
  delay(50);
  Serial.flush();   
  inString = ""; 
  delay(2000);

 

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

delay() -тут вообще не очень понятно зачем.   Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);

Откуда отрицательные координаты курсора?

А "данные" у вас скорее всего не "проскакивают и залазят", а просто "остаются на экране".

Смотрите, предположим, я выведу в левый верхний угол экрана цифру

"12345"

А потом, через какое-то время, опять сделую lcd.SetCursor(0,0) и выведу "678".

Что будет на экране? 678? Не-а. Раз я вывел только три символа, то только три символа и "поменяеются" (затрут старое значение). А что они "не покрыли", то и останется на экране. В итоге я увижу

"67845"

Что скорее всего вы и обозвали "проскочило".

Что-бы старые цифры стали не видны, нужно их "затереть", ну хотя-бы пробелами. Я должен был сделать что-то типа

lcd.print(678);
lcd.print("  "); // выводим два "затирочных пробела");

Тогда я на экране увижу "678" и "12345" уйдет целиком и полностью.

Либо, как вариант. Я мог перед выводом 678, вывести строку пробелов, что-бы очистить первую строку целиком:

lcd.setCursor(0,0)
lcd.print("                ");// количество пробелов равно ширине экрана, фактически "очистка первой строки"
lcd.print(678);

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

maksim
Offline
Зарегистрирован: 12.02.2012

jkeeeng пишет:

Но уже разобрался используя другой подход. 

Вот собвственно сам метод:
 

 Serial.write('H');
  delay(500);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 1);
      lcd.print("Humidity:    ");
      lcd.print(inString);
      lcd.print("%");
      delay(50);
      dataString += "\nhum,";
      dataString += inString;
    }
  }
  delay(50);
  Serial.flush();   
  inString = ""; 
  delay(2000);

Это называется индуский подход - как и ваш огрызок индуского кода.

leshak пишет:

Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);

Это не моя опечатка.

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

maksim пишет:

leshak пишет:

Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);

Это не моя опечатка.

А я,  в 80% случае, не вставленный нормально код - вообще не смотрю :) Так что "-4" впервые увидел в вашем сообщении. Опечатался, процитировал чужой код и не заметил - какая разница? :) В любом случае понятно что сознательно вы такого бы не написали. Хотя я сильно и не вникал, но как мне помнится в библиотеке же вроде нет relative координат? Вроде только absolute были.

 

jkeeeng
Offline
Зарегистрирован: 01.09.2013

leshak пишет:

delay() -тут вообще не очень понятно зачем.   Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);

Откуда отрицательные координаты курсора?

 

Все тут хорошо... просто некоторые китайские дисплеи 16 на 4 строки имеют такую проблему как отрицательную координату... иначе не работает!  Поэтому делаем как работает. Это просто возможно из-за того что библиотека и большинство контроллеров для ЖД идут для 16х2, а не 16х4...  Но углубляться более в эту проблему с отр. кординатами нет времени... 

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

jkeeeng
Offline
Зарегистрирован: 01.09.2013

leshak пишет:

maksim пишет:

leshak пишет:

Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);

Это не моя опечатка.

А я,  в 80% случае, не вставленный нормально код - вообще не смотрю :) Так что "-4" впервые увидел в вашем сообщении. Опечатался, процитировал чужой код и не заметил - какая разница? :) В любом случае понятно что сознательно вы такого бы не написали. Хотя я сильно и не вникал, но как мне помнится в библиотеке же вроде нет relative координат? Вроде только absolute были.

 

 

Все тут правильно с отр. знаком. Просто библиотеки писались под  16на2 и 20на4... а уже после начали производить 16на4... следовательно используя дисплей на 4 строки нужно учитывать сдвиг на 4 знака... так как библиотека на 20 знаков и 4 строки. Можно переписать или поискать другую библиотеку, но зачем? Если все работает!

jkeeeng
Offline
Зарегистрирован: 01.09.2013

maksim пишет:

jkeeeng пишет:

Но уже разобрался используя другой подход. 

Вот собвственно сам метод:
 

 Serial.write('H');
  delay(500);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 1);
      lcd.print("Humidity:    ");
      lcd.print(inString);
      lcd.print("%");
      delay(50);
      dataString += "\nhum,";
      dataString += inString;
    }
  }
  delay(50);
  Serial.flush();   
  inString = ""; 
  delay(2000);

Это называется индуский подход - как и ваш огрызок индуского кода.

 

 

Почему вы так считаете? Просто упрощать код времени нет... А ваши и другие методы не прокатили в моем случае. А этот работает как ни страно. Всеравно спасибо вам. В другой раз будет больше времени обязательно разберусь и доведу код.
 

jkeeeng
Offline
Зарегистрирован: 01.09.2013

Да и все как-то привязались к выводу на дисплей данных, а не вывода данных с серийного порта. Проблем с выводом на экран то и небыло.

maksim
Offline
Зарегистрирован: 12.02.2012

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

jkeeeng
Offline
Зарегистрирован: 01.09.2013

maksim пишет:

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

Возможно, спорить не буду! Времени мало чтобы разбераться. 

А насчет огрызка вы правы, извеняйте. Не опытен в этих делах. До этого не приходилось на форуме обращаться за помощью, все находилось в просторах интернета. 

И вот вам полноценный код: 

2-ого пункта сбора данных из 3-х (остальные два по такому же принципу):


#include <LiquidCrystal.h>
#include <Wire.h>

#define DEVICE (0x53) // Device address as specified in data sheet 

LiquidCrystal lcd(9, 8, 4, 5, 6, 7);
int      serial;
int      W = 10;
int      soil = A0;
int      rain  =  A1;
int      mode;
int      conn;
int      i;
char     check_send = 'B';
char     sens_lisn;
char     check_echo;
int      sens_x, sens_y, sens_z, sens_vibr;

byte     _buff[6];

char     POWER_CTL = 0x2D;	//Power Control Register
char     DATA_FORMAT = 0x31;
char     DATAX0 = 0x32;	//X-Axis Data 0
char     DATAX1 = 0x33;	//X-Axis Data 1
char     DATAY0 = 0x34;	//Y-Axis Data 0
char     DATAY1 = 0x35;	//Y-Axis Data 1
char     DATAZ0 = 0x36;	//Z-Axis Data 0
char     DATAZ1 = 0x37;	//Z-Axis Data 1


void setup()
{
  pinMode (A0, INPUT);
  Serial.begin(9600);
  Wire.begin();
  
   //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
  writeTo(DATA_FORMAT, 0x01);
  //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
  writeTo(POWER_CTL, 0x08);
  
  delay(50);
  lcd.begin(16, 4);  
  selection();
  startup();
  if ( mode == 1 )
  {
  communication();
  } 
  mode_show();
  lcd.clear();
}

void loop() 
{  
  if ( mode == 1 )
    {
      sens_read();
    }  
  else
    {
      sens_disp();
    }
}


void selection()
{
  lcd.clear();
  i = 0;
  do
  { 
    if (digitalRead(W) == LOW)
    {
       mode=1;
       break;
    }
    else
    {
       mode=2;
       break;
    }
  } while ( i = 0 ); 
}

void communication()
{
  conn = 0;
  check_echo = 0;
  do
  { 
    i=i-1;
    lcd.clear();
    delay(500);
    Serial.write(check_send);
    lcd.setCursor(0, 1);
    lcd.print(" COMMUNICATION");
    lcd.setCursor(-4, 2);
    lcd.print("ESTABLISHMENT...");
    delay(500);
    if(Serial.available() > 0)
    {
      check_echo = Serial.read();
    if (check_echo = check_send) 
      {
        conn = 1;
      } 
    }
  } while ( conn == 0 );  
}

void sens_read()
{
 if(Serial.available() > 0)
        {
          sens_lisn = Serial.read();
          if(sens_lisn == 'V')
          {
            vibr_read();
            delay(50);
          }
          
          if(sens_lisn == 'X')
          {
            x_read();
            delay(50);
          }
          if(sens_lisn == 'Y')
          {
            
            y_read();
            delay(50);
          }
          if(sens_lisn == 'Z')
          {
            
            z_read();
            delay(50);
          }
          
      }
     
}

void startup()            
{
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print("WELCOME  TO");
  lcd.setCursor(0, 1);
  lcd.print("     INTELLIGENT");
  lcd.setCursor(-4, 2); 
  lcd.print("MONITORING");
  lcd.setCursor(-4, 3); 
  lcd.print("          SYSTEM");
  delay(3500);
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print(" IMPLEMENTED BY");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  lcd.setCursor(-4, 2);
  lcd.print("MODE:");
  if (mode == 1)
    {
    lcd.print("  WIRELESS");
    }
  if (mode == 2)
    {
    lcd.print(" STANDALONE");
    }
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING");
  delay(1500);
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING.");
  delay(1500);
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING..");
  delay(1500);
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING...");
  delay(1500);
  
}

void mode_show() 
{ 
   lcd.clear();
   switch (mode)
    {
    case 1:
      lcd.setCursor(0, 1);
      lcd.print("    CONNECTED");   
      lcd.setCursor(-4, 2);
      lcd.print("MODE:");
      lcd.print("  WIRELESS");
      break;
    case 2:   
      lcd.setCursor(-4, 2);
      lcd.print("MODE:");
      lcd.print(" STANDALONE");
      break;
    } 
    lcd.setCursor(-4, 3); 
    lcd.print(" XBEE ROUTER #3");
   
    delay(2000);
}

void vibr_read()
{
  int sens_vibr = digitalRead(A0);
  Serial.println(sens_vibr);
  lcd.setCursor(0, 0); 
  lcd.print("Vibration:  ");
  lcd.print(sens_vibr);
  delay(50);
}

void x_read()
{
  uint8_t howManyBytesToRead = 6;
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
  // each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
  // thus we are converting both bytes in to one int
  int sens_x = (((int)_buff[1]) << 8) | _buff[0];  
  Serial.println(sens_x);
  lcd.setCursor(0, 1);
  lcd.print("X Axis:     ");
  lcd.print(sens_x);
  lcd.print((char)223);
  delay(50);
}

void y_read()
{
  uint8_t howManyBytesToRead = 6;
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
  // each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
  // thus we are converting both bytes in to one int  
  int sens_y = (((int)_buff[3]) << 8) | _buff[2];
  Serial.println(sens_y);
  lcd.setCursor(-4, 2); 
  lcd.print("Y Axis:     ");
  lcd.print(sens_y);
  lcd.print((char)223);
  delay(50);
}

void z_read()
{
   uint8_t howManyBytesToRead = 6;
   readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
   // each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
   // thus we are converting both bytes in to one int
   int sens_z = (((int)_buff[5]) << 8) | _buff[4];
   Serial.println(sens_z);
   lcd.setCursor(-4, 3);
   lcd.print("Z Axis:     ");
   lcd.print(sens_z);
   lcd.print((char)223);
   delay(50);
}

void writeTo(byte address, byte val) {
  Wire.beginTransmission(DEVICE); // start transmission to device 
  Wire.write(address);             // send register address
  Wire.write(val);                 // send value to write
  Wire.endTransmission();         // end transmission
}

// Reads num bytes starting from address register on device in to _buff array
void readFrom(byte address, int num, byte _buff[]) {
  Wire.beginTransmission(DEVICE); // start transmission to device 
  Wire.write(address);             // sends address to read from
  Wire.endTransmission();         // end transmission

  Wire.beginTransmission(DEVICE); // start transmission to device
  Wire.requestFrom(DEVICE, num);    // request 6 bytes from device

  int i = 0;
  while(Wire.available())         // device may send less than requested (abnormal)
  { 
    _buff[i] = Wire.read();    // receive a byte
    i++;
  }
  Wire.endTransmission();         // end transmission
}

void sens_disp()
{
  int sens_vibr = digitalRead(A0);
  lcd.setCursor(0, 0); 
  lcd.print("Vibration:  ");
  lcd.print(sens_vibr);
  delay(5000);
  uint8_t howManyBytesToRead = 6;
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
  int sens_x = (((int)_buff[1]) << 8) | _buff[0];   
  lcd.setCursor(0, 1);
  lcd.print("X Axis:  ");
  lcd.print(sens_x);
  delay(5000);
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
  int sens_y = (((int)_buff[3]) << 8) | _buff[2];
  lcd.setCursor(-4, 2); 
  lcd.print("Y Axis:  ");
  lcd.print(sens_y);
  lcd.print("  ");
  delay(5000);
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345
  int sens_z = (((int)_buff[5]) << 8) | _buff[4];
  lcd.setCursor(-4, 3);
  lcd.print("Z Axis:  ");
  lcd.print(sens_z);
  lcd.print("  ");
  delay(5000);
}

и код  самого сервера сбора данных с которым были проблемы:
 


#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>

#define APIKEY         "" // replace your pachube api key here
#define FEEDID          // replace your feed ID
#define USERAGENT      "" // user agent is the project name

LiquidCrystal lcd(9, 8, 4, 5, 6, 7);
int      serial;
char     check_read;
int      conn;
int      i;
int      r1,r2,r3;
int      n = 0;
char     check_echo;
int      sens_ppm, sens_hum, sens_temp, sens_pir;
int      sens_x, sens_y, sens_z, sens_vibr;
int      sens_temp_1, sens_pres, sens_soil, sens_rain;
byte     ppm, hum, temp, pir;
byte      temp_1, pres, soil, rain;
byte      x, y, z, vibr;
String   dataString = "";
char     s[4]; 
char     buffer;
String   readString;
String   inString = "";    // string to hold input
int      result = 0;
int      lf = 13;
char a[1];
long b = 0;
boolean End, minus = 0;


char serialData[3];

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,0,55);
EthernetClient client;
IPAddress server(216,52,233,122);      // numeric IP for api.pachube.com
//char server[] = "api.pachube.com";   // name address for pachube API
unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 60000;  //delay between updates to pachube.com


void setup()
{
  Serial.begin(9600);
  
  lcd.begin(16, 4);
  delay(100);
  startup();
  communication(); 
    // give the ethernet module time to boot up:
  delay(100);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // DHCP failed, so use a fixed IP address:
    Ethernet.begin(mac, ip);
  }
  delay(500);
if (conn == 1) 
  {
    online();
  } 
  else 
  {
    offline();
  }
}

void loop() {

  if (conn == 1) 
      {
              Serial.flush();   
              inString = ""; 
              lcd.clear();
              delay(100);
              sens_read();
              sendData(dataString);
       
      }
  else 
  {
    offline();
  }   
  
}

void online()
{   
    n = r1 + r2 + r3;
    lcd.clear();
    lcd.setCursor(0, 0); 
    lcd.print("MAIN COORDINATOR"); 
    lcd.setCursor(-4, 2); 
    lcd.print("    DEVICES ");
    lcd.setCursor(-4, 3); 
    lcd.print("  CONNECTED  ");
    lcd.print(n);
    lcd.setCursor(0, 1);
    lcd.print(r1);
    lcd.print("     ");
    lcd.print(r2);
    lcd.print("     ");
    lcd.print(r3);
    delay(5000);
}

void offline()
{
    do
    {
    lcd.clear();
    lcd.setCursor(0, 0); 
    lcd.print("MAIN COORDINATOR"); 
    lcd.setCursor(-4, 2); 
    lcd.print("  DISCONNECTED");
    lcd.setCursor(-4, 3); 
    lcd.print("    OFFLINE");
    lcd.setCursor(0, 1);
    lcd.print(check_read = Serial.read());
    } while ( conn == 0 ); 
}
  

void communication()
{
  r1=0;
  r2=0;
  r3=0;
  i=5;
  conn = 0;
  do
{       
      i=i-1;
      lcd.clear();
      delay(500);
      lcd.setCursor(-4, 3); 
      lcd.print("Timeout:  ");
      lcd.print(i);
      lcd.print(" sec");
      lcd.setCursor(0, 1);
      lcd.print(" COMMUNICATION");
      lcd.setCursor(-4, 2);
      lcd.print("ESTABLISHMENT...");
      delay(500);
        if(Serial.available() > 0)
        {
          check_read = Serial.read();
          if(check_read == 'A' && r1 == 0)
          {
            check_echo = check_read;
            conn=1;
            Serial.write(check_echo);
            r1=1;
            delay(50);
          }
          
          if(check_read == 'B' && r2 == 0)
          {
            check_echo = check_read;
            conn = 1;
            Serial.println(check_echo);
            r2=1;
            delay(50);
          }
          if(check_read == 'C' && r3 == 0)
          {
            check_echo = check_read;
            conn = 1;
            Serial.println(check_echo);
            r3=1;
            delay(50);
          }
          
      }
} while ( i > 1 );
}




void sens_read()
{
  
  
  //ROUTER#1
  
  Serial.write('O');
  delay(500);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    delay(50);
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 0);
      lcd.print("CO2:     ");
      lcd.print(inString);
      lcd.print("PPM");
      delay(50);
      dataString = "ppm,";
      dataString += inString;
   
   }
  }
  delay(100);
  Serial.flush();   
  inString = ""; 
  delay(2000);    
    
  Serial.write('H');
  delay(500);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 1);
      lcd.print("Humidity:    ");
      lcd.print(inString);
      lcd.print("%");
      delay(50);
      dataString += "\nhum,";
      dataString += inString;
    }
  }
  delay(50);
  Serial.flush();   
  inString = ""; 
  delay(2000);
  
  Serial.write('T');
  delay(500);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(-4, 2); 
      lcd.print("Temperature:");
      lcd.print(inString);
      lcd.print((char)223);
      lcd.print("C");
      delay(50);
      dataString += "\ntemp,";
      dataString += inString;
       }
  }
  Serial.flush();   
  inString = ""; 
  delay(2000);
  
  Serial.write('I');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(-4, 3);
      lcd.print("Presence:    ");
      if (sens_pir == HIGH)
       {
        lcd.print(" NO");
       }
      if (sens_pir == LOW)
       {
        lcd.print("YES");
       }
      delay(50);
      dataString += "\npir,";
      dataString += pir;
     }
  } 
  Serial.flush(); 
  inString = ""; 
  delay(2000);
  
  
  //ROUTER#2
  lcd.clear();
  Serial.write('V');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      delay(50);
      lcd.setCursor(0, 0); 
      lcd.print("Vibration:  ");
      lcd.print(inString);
      dataString += "\nvibr,";
      dataString += vibr;
   }
  }  
  inString = "";
  Serial.flush();
  delay(2000);
  
  Serial.write('X');
  delay(50);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
    
      lcd.setCursor(0, 1);
      lcd.print("X Axis:     ");
      lcd.print(inString);
      lcd.print((char)223);
      lcd.print(" ");
      dataString += "\nx,";
      dataString += x;
      
      }
  }
  Serial.flush();
  inString = ""; 
  delay(2000);
  
  Serial.write('Y');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
    
      lcd.setCursor(-4, 2); 
      lcd.print("Y Axis:     ");
      lcd.print(inString);
      lcd.print((char)223);
      lcd.print(" ");
      dataString += "\ny,";
      dataString += inString;
      
      }
  }
  Serial.flush(); 
  inString = ""; 
  delay(2000);
  
  Serial.write('Z');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
   
      lcd.setCursor(-4, 3);
      lcd.print("Z Axis:     ");
      lcd.print(inString);
      lcd.print((char)223);
      lcd.print(" ");
      dataString += "\nz,";
      dataString += inString;
      
  }
  }
  Serial.flush();   
  inString = ""; 
  delay(2000);
 
  delay(2000);
  
  //ROUTER#3
  lcd.clear();
  Serial.write('M');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 0); 
      lcd.print("Temperature:");;
      lcd.print(inString);
      lcd.print((char)223);
      lcd.print("C");
      delay(50);
      dataString += "\ntemp_1,";
      dataString += inString;
      
  }
  }
  Serial.flush();   
  inString = ""; 
  delay(2000);
 
 
  Serial.write('P');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(0, 1);
      lcd.print("Pressure: ");
      lcd.print(inString);
      lcd.print("kPa");
      delay(50);
      dataString += "\npres,";
      dataString += inString;
   }
  }
  Serial.flush();   
  inString = ""; 
  delay(2000);
    
    
  Serial.write('R');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(-4, 2); 
      lcd.print("Rain Sensor:");
      lcd.print(inString);
      lcd.print("  ");
      delay(50);
      dataString += "\nrain,";
      dataString += inString;
    }
  }
  Serial.flush();   
  inString = ""; 
  delay(2000);
  
  Serial.write('S');
  delay(100);
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char 
      // and add it to the string:
      inString += (char)inChar; 
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      
      
      lcd.setCursor(-4, 3);
      lcd.print("Soil Sensor:");
      lcd.print(inString);
      lcd.print("  ");
      delay(50);
      dataString += "\nsoil,";
      dataString += inString;
    }
  }
  Serial.flush();   
  inString = ""; 
  delay(2000);
  
}

void startup()            
{
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print("WELCOME  TO");
  lcd.setCursor(0, 1);
  lcd.print("     INTELLIGENT");
  lcd.setCursor(-4, 2); 
  lcd.print("MONITORING");
  lcd.setCursor(-4, 3); 
  lcd.print("          SYSTEM");
  delay(3500);
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print(" IMPLEMENTED BY");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  lcd.setCursor(-4, 2);
  lcd.print("  COORDINATOR");
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING");
  delay(1500);
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING.");
  delay(1500);
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING..");
  delay(1500);
  lcd.setCursor(-4, 3); 
  lcd.print("    LOADING...");
  delay(1500);
}

void sendData(String thisData) {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.print("PUT /v2/feeds/");
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");
    client.println("Host: api.pachube.com");
    client.print("X-pachubeApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");
    client.println(thisData.length());

    // last pieces of the HTTP PUT request:
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

    // here's the actual content of the PUT request:
    client.println(thisData);
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
  // note the time that the connection was made or attempted:
  lastConnectionTime = millis();
}