Нужна помощь по serial
- Войдите на сайт для отправки комментариев
Пт, 26/12/2014 - 11:28
Из ардуино приходят строковые значения 1 24,7 5 48,1 3 26,5, где первое число индекс переменной, а второе строковое значение переменной. Ардуино отпраляет только тогда, когда значение переменной изменилось.
Как организовать идентификацию переменной и запись файл на Processing?
Сам не програмист, может что то не так описал.
Буду благодарен за любые подсказки!
Нужен парсинг строки по какому либо условию.
Условие не увидел. Нужно более четкое определение получаемой строки.
Обычно в строку вставляется символ, или группа, принахождении которого начинается обработка последующих символов.
Скетч отпраялющего ардуино
#include <Wire.h> #include <OneWire.h> #include "DHT.h" #include <BMP085.h> byte _d18x2x3Addr[8]={0x28, 0xB, 0x38, 0xB5, 0x5, 0x0, 0x0, 0x79}; byte _d18x2x2Addr[8]={0x28, 0x71, 0xF, 0xB6, 0x5, 0x0, 0x0, 0x73}; byte _d18x2x1Addr[8]={0x28, 0xBE, 0xDC, 0xB5, 0x5, 0x0, 0x0, 0x50}; DHT _dht1(5, DHT22); BMP085 _bmp085 = BMP085(); long _bmp085P = 0; long _bmp085T = 0; long _bmp085A = 0; OneWire _ow3(3); String _gtv1; String _gtv2; String _gtv3; String _gtv4; String _gtv5; String _gtv6; String _gtv7; String _gtv8; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; unsigned long _d18x2x2Tti = 0UL; float _d18x2x2O = 0.00; unsigned long _d18x2x3Tti = 0UL; float _d18x2x3O = 0.00; unsigned long _dht1Tti = 0UL; float _dht1t = 0.00; float _dht1h = 0.00; unsigned long _bmp0851Tti = 0UL; String _SV1CP0 = "0"; bool _SV1CP0needSend = 0; String _SV2CP0 = "0"; bool _SV2CP0needSend = 0; String _SV3CP0 = "0"; bool _SV3CP0needSend = 0; String _SV4CP0 = "0"; bool _SV4CP0needSend = 0; String _SV5CP0 = "0"; bool _SV5CP0needSend = 0; String _SV6CP0 = "0"; bool _SV6CP0needSend = 0; String _SV7CP0 = "0"; bool _SV7CP0needSend = 0; void setup() { Wire.begin(); _bmp085.init(MODE_ULTRA_HIGHRES,9300, true); Serial.begin(9600); _dht1.begin(); } void loop() {if(_isTimer(_dht1Tti, 5000)) { _dht1Tti = millis(); float tempDht5; tempDht5 = _dht1.readTemperature(); if (!(isnan(tempDht5))){_dht1t=tempDht5; } tempDht5 = _dht1.readHumidity(); if (!(isnan(tempDht5))){_dht1h=tempDht5; } }if(_isTimer(_bmp0851Tti, 5000)) { _bmp0851Tti = millis(); _bmp085.getAltitude(&_bmp085A); _bmp085.getPressure(&_bmp085P); _bmp085.getTemperature(&_bmp085T); } if(_isTimer(_d18x2x1Tti, 3000)) { _d18x2x1Tti = millis(); _d18x2x1O= _readDS18_ow3(_d18x2x1Addr, 0);} if(_isTimer(_d18x2x2Tti, 3000)) { _d18x2x2Tti = millis(); _d18x2x2O= _readDS18_ow3(_d18x2x2Addr, 0);} if(_isTimer(_d18x2x3Tti, 3000)) { _d18x2x3Tti = millis(); _d18x2x3O= _readDS18_ow3(_d18x2x3Addr, 0);} _gtv1 = ( _floatToStringWitRaz((_d18x2x1O),2)); _gtv2 = ( _floatToStringWitRaz((_d18x2x2O),2)); _gtv3 = ( _floatToStringWitRaz((_d18x2x3O),2)); _gtv7 = ( _floatToStringWitRaz(_dht1t,2)); _gtv8 = ( _floatToStringWitRaz(_dht1h,0)); _gtv4 = ( _floatToStringWitRaz((_bmp085T)/(10.00),1)); _gtv5 = ( _floatToStringWitRaz((_bmp085P)/(133.322),1)); _gtv6 = (String(_bmp085A)); String _SV1CP0temp; _SV1CP0temp = _gtv5; if (_SV1CP0temp != _SV1CP0) {_SV1CP0 = _SV1CP0temp; _SV1CP0needSend = 1;} String _SV2CP0temp; _SV2CP0temp = _gtv4; if (_SV2CP0temp != _SV2CP0) {_SV2CP0 = _SV2CP0temp; _SV2CP0needSend = 1;} String _SV3CP0temp; _SV3CP0temp = _gtv7; if (_SV3CP0temp != _SV3CP0) {_SV3CP0 = _SV3CP0temp; _SV3CP0needSend = 1;} String _SV4CP0temp; _SV4CP0temp = _gtv8; if (_SV4CP0temp != _SV4CP0) {_SV4CP0 = _SV4CP0temp; _SV4CP0needSend = 1;} String _SV5CP0temp; _SV5CP0temp = _gtv1; if (_SV5CP0temp != _SV5CP0) {_SV5CP0 = _SV5CP0temp; _SV5CP0needSend = 1;} String _SV6CP0temp; _SV6CP0temp = _gtv2; if (_SV6CP0temp != _SV6CP0) {_SV6CP0 = _SV6CP0temp; _SV6CP0needSend = 1;} String _SV7CP0temp; _SV7CP0temp = _gtv3; if (_SV7CP0temp != _SV7CP0) {_SV7CP0 = _SV7CP0temp; _SV7CP0needSend = 1;} if(_SV1CP0needSend) { _SV1CP0needSend = 0; Serial.write (1); Serial.print (1); Serial.write (2); Serial.print (_SV1CP0); Serial.write (3);}if(_SV2CP0needSend) { _SV2CP0needSend = 0; Serial.write (1); Serial.print (2); Serial.write (2); Serial.print (_SV2CP0); Serial.write (3);}if(_SV3CP0needSend) { _SV3CP0needSend = 0; Serial.write (1); Serial.print (3); Serial.write (2); Serial.print (_SV3CP0); Serial.write (3);}if(_SV4CP0needSend) { _SV4CP0needSend = 0; Serial.write (1); Serial.print (4); Serial.write (2); Serial.print (_SV4CP0); Serial.write (3);}if(_SV5CP0needSend) { _SV5CP0needSend = 0; Serial.write (1); Serial.print (5); Serial.write (2); Serial.print (_SV5CP0); Serial.write (3);}if(_SV6CP0needSend) { _SV6CP0needSend = 0; Serial.write (1); Serial.print (6); Serial.write (2); Serial.print (_SV6CP0); Serial.write (3);}if(_SV7CP0needSend) { _SV7CP0needSend = 0; Serial.write (1); Serial.print (7); Serial.write (2); Serial.print (_SV7CP0); Serial.write (3);} } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} } String _floatToStringWitRaz(float value, int raz) { float tv; int ti = int(value); String ts = String(ti); if (raz == 0) { return ts; } ts += "."; float tf = abs(value - ti); for (int i = 1; i <= raz; i++ ) { tv = tf * 10; ti = int(tv); ts += String(ti); tf = (tv - ti); } return ts; } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow3(byte addr[8], byte type_s) { byte data[12]; byte i; _ow3.reset(); _ow3.select(addr); _ow3.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow3.read();} _ow3.reset(); _ow3.select(addr); _ow3.write(0x44, 1); return _convertDS18x2xData(type_s, data);}Скетч принимающего ардуино
String _gtv1; String _gtv2; String _RV1CP0 = "0"; String _RV2CP0 = "0"; int _resiveMode0 = 0; bool _hasRessiveVariable0 = 0; String _resiveVariableString0; int _resiveVariableIndex0 = 0; void setup() { Serial.begin(9600); } void loop() {if(Serial.available()){_ressiveByte(0, (Serial.read()));} if(_hasRessiveVariable0) {_hasRessiveVariable0 =0; if(_resiveVariableIndex0 == 1) {_RV1CP0 = _resiveVariableString0;} if(_resiveVariableIndex0 == 2) {_RV2CP0 = _resiveVariableString0;} } _gtv1 = _RV1CP0; _gtv2 = _RV2CP0; } void _ressiveByte(int port, byte resiveByte) { int tempStatus; tempStatus = _statusForPort(port); if (tempStatus==0) { if (resiveByte == 1) { _setStatusToPort(1,port); _setHasDataToPort(0, port); _resetStringVariableToPort(port); } } if (tempStatus==1) { if((resiveByte == 1 )||(resiveByte == 3)) { _setStatusToPort(0,port); } else { if(resiveByte==2) { _setStatusToPort(2,port); _setIndexVariableToPort((_stringVariableFromPort(port)),port); _resetStringVariableToPort(port); } else { _addByteToVariableToPort(port, resiveByte); } } } if (tempStatus==2) { if((resiveByte == 1 )||(resiveByte == 2)) { _setStatusToPort(0,port); } else { if (resiveByte==3) { _setStatusToPort(0,port); _setHasDataToPort(1, port); } else { _addByteToVariableToPort(port, resiveByte); } } } } int _statusForPort(int port) { if(port == 0) { return _resiveMode0;}} void _setStatusToPort(int newStatus, int port) {if(port == 0) { _resiveMode0= newStatus;} } String _stringVariableFromPort(int port) { if(port == 0) { return _resiveVariableString0;}} void _setIndexVariableToPort(String value, int port) {if(port == 0) { _resiveVariableIndex0= value.toInt();}} void _resetStringVariableToPort(int port) {if(port == 0) { _resiveVariableString0= "";}} void _addByteToVariableToPort(int port, byte resiveByte) {if(port == 0) { _resiveVariableString0+= char(resiveByte);}} void _setHasDataToPort(bool value, int port) {if(port == 0) { _hasRessiveVariable0= value;}}То есть, между двумя ардуино все работает!
Скетчи формирует программа. Отсутствует возможность сформировать сформировать для Processing
Нужен парсинг строки по какому либо условию.
Условие не увидел. Нужно более четкое определение получаемой строки.
Обычно в строку вставляется символ, или группа, принахождении которого начинается обработка последующих символов.
Пришлось разобраться с таблицей ASCII/
boban_, спасибо за наводку.
Насколько я понял на данный момент ардуино при изменении переменной отправляет: