Проблема получения данных с серийного порта Arduino
- Войдите на сайт для отправки комментариев
Доброго время суток!
Работаю над небольшим проектом мониторинга состояний окружающей среды... Он состоит из 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-ой Ардуины...
Все от того что не понимаете разницы между типами данных, а отсюда не знаете что ищите. Плюс ко всему из вашего обгрызка кода не ясно в каком виде вы пытаетесь принять данные.
http://arduino.ru/forum/programmirovanie/upravlenie-servoprivodom-po-serial
Данные отсылаются скорее всего в ASCII... отсылаются с 1ой Ардуины на 4ую при помощи команды:
Serial.println(sens_temp); //к примеру, где sens_temp = 1204
На другом конце принимаются в таком же виде "1204", проверено при помощи монитора серийного порта. Но самой ардуиной не получаются они целым числом. Пробовал и в массив загнать и Serial.readBytesUntil() функции и все никак...
Что не понятно из #1 поста?
Да чесное слово многое... посмотрел я ту ветку на форуме и всеравно нечего не получается. У меня немного другой случай или я что-то делаю не так
Случай у вас именно тот.
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);Уже пробовал, но не получилось через данный метод... Но уже разобрался используя другой подход. И все славо богу заработало. Осталось с делэями разобраться, некоторые данные иногда проскакивают и залазят на место данных следующего датчика.
Вот собвственно сам метод:
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);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);Но... визуально это может выглядить "неприятно". Как бы "мигание". Вывод целой строки - это немного медленно.
Но уже разобрался используя другой подход.
Вот собвственно сам метод:
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);Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
А я, в 80% случае, не вставленный нормально код - вообще не смотрю :) Так что "-4" впервые увидел в вашем сообщении. Опечатался, процитировал чужой код и не заметил - какая разница? :) В любом случае понятно что сознательно вы такого бы не написали. Хотя я сильно и не вникал, но как мне помнится в библиотеке же вроде нет relative координат? Вроде только absolute были.
delay() -тут вообще не очень понятно зачем. Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
Откуда отрицательные координаты курсора?
Все тут хорошо... просто некоторые китайские дисплеи 16 на 4 строки имеют такую проблему как отрицательную координату... иначе не работает! Поэтому делаем как работает. Это просто возможно из-за того что библиотека и большинство контроллеров для ЖД идут для 16х2, а не 16х4... Но углубляться более в эту проблему с отр. кординатами нет времени...
А насчет затирки все понятно и все уже учтено, но не в выше упомянутом коде.
Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
А я, в 80% случае, не вставленный нормально код - вообще не смотрю :) Так что "-4" впервые увидел в вашем сообщении. Опечатался, процитировал чужой код и не заметил - какая разница? :) В любом случае понятно что сознательно вы такого бы не написали. Хотя я сильно и не вникал, но как мне помнится в библиотеке же вроде нет relative координат? Вроде только absolute были.
Все тут правильно с отр. знаком. Просто библиотеки писались под 16на2 и 20на4... а уже после начали производить 16на4... следовательно используя дисплей на 4 строки нужно учитывать сдвиг на 4 знака... так как библиотека на 20 знаков и 4 строки. Можно переписать или поискать другую библиотеку, но зачем? Если все работает!
Но уже разобрался используя другой подход.
Вот собвственно сам метод:
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);Почему вы так считаете? Просто упрощать код времени нет... А ваши и другие методы не прокатили в моем случае. А этот работает как ни страно. Всеравно спасибо вам. В другой раз будет больше времени обязательно разберусь и доведу код.
Да и все как-то привязались к выводу на дисплей данных, а не вывода данных с серийного порта. Проблем с выводом на экран то и небыло.
У вас не заработало потому что вы не смогли правильно воспользоваться тем что вам дали, а огрызок он от того что нужно показывать весь код, что бы можно было как то видеть что у вас там не так.
У вас не заработало потому что вы не смогли правильно воспользоваться тем что вам дали, а огрызок он от того что нужно показывать весь код, что бы можно было как то видеть что у вас там не так.
Возможно, спорить не буду! Времени мало чтобы разбераться.
А насчет огрызка вы правы, извеняйте. Не опытен в этих делах. До этого не приходилось на форуме обращаться за помощью, все находилось в просторах интернета.
И вот вам полноценный код:
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(); }