serial byte naar display

Arduino specifieke Software
Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

serial byte naar display

Berichtdoor ilioSS » 03 Okt 2014, 17:25

Hallo,

Via mijn xbee lees ik in met serial monitor
<R19S7>
<R19S25>
<R7S210>
Dit zijn waardes die richting van de R wind en S speed van de wind voorstellen.
Nu wil ik deze data op een display tonen.
Hoe kan ik de string opvangen bewerken en displayen?

Ik zelf denk iets met een array die vullen en dan uitlezen.

Al veel geprobeerd met strings etc. maar geen resultaat.

Serial.print(inByte); geeft alle losse letters heel snel zichtbaar ???

e.e.a. is voor mijn arduino xbee weertstation.

Groet,
ilioSS

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: serial byte naar display

Berichtdoor nicoverduin » 03 Okt 2014, 17:38

Begin eerst ff met de code die je gebruikt. Als iemand wil weten wat je precies doet is de code wel handig. En dan graag tussen de [ code2=cpp ] en [ /code ] tags (zonde de spaties ertussen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: serial byte naar display

Berichtdoor shooter » 04 Okt 2014, 22:42

als je dus een R leest komt er een getal tot je een S ziet en dan komt er nog een getal tot je de > ziet.
dat zijn dus twee kleine strings die je omzet naar een integer.
en die print je dan.
dus een string bewerking.
deze functie roep je elke seconde aan vanuit je loop , dan krijg je elke seconde twee getallen.
paul deelen
shooter@home.nl

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: serial byte naar display

Berichtdoor ilioSS » 12 Okt 2014, 13:56

Gents,
Na heel wat uitvogelen heb ik mijn vraag beantwoord gekregen.
Hoewel waarschijnlijk niet volgens mooi programmeer werk maar wel werkbaar.
Wat is de case.
Ik heb een weerstation dat defect was. Wel bruikbaar is de windsnelheid en richting gever.
Middels het uitlezen van de reed contacten van de richting en de reed contacten van de snelheid die ik op een inerupt ingang heb zitten
is het mogelijk om via de XBEE deze waardes te versturen.
Inlezen ook middels een XBEE en toonbaar maken op de display van 128-64 ( was ook een zoektocht om die werkend te krijgen ) alles op een mega
Van beide script hier de code.
[
void loop() {
Serial.begin(9600);
float temperature = getTemp();
while(Serial.available() > 0)
{
for ( int i=1; i<11; i++){
inByte= Serial.read();
if(inByte=='<');{
incomingByte[i] = inByte;
}
}

rValue1=(incomingByte[1]);
rValue2=(incomingByte[2]);
rValue3=(incomingByte[3]);
rValue4=(incomingByte[4]);
rValue5=(incomingByte[5]);
rValue6=(incomingByte[6]);
rValue7=(incomingByte[7]);
rValue8=(incomingByte[8]);
rValue9=(incomingByte[9]);
rValue10=(incomingByte[10]);

for ( int i=1; i<11; i++)
{

u8g.firstPage();
do {
u8g.setFont(u8g_font_04b_03);
u8g.setColorIndex(1);
// Teperature printen
u8g.setPrintPos(0,5);
u8g.print("Temp.");
u8g.print(temperature);
u8g.setPrintPos(40,5);
u8g.print(" C");
//Wind richting
u8g.setPrintPos(0,13);
u8g.print("Wind richting");
u8g.print(rValue2);
u8g.print(rValue3);
u8g.print(rValue4);
u8g.print(rValue5);
u8g.print(rValue6);
u8g.print(rValue7);
//Wind kracht in bft
u8g.setPrintPos(0,21);
u8g.print("Wind");
u8g.print(rValue9);
u8g.print(rValue10);
u8g.setPrintPos(27,21);
u8g.print("bft");
}
while( u8g.nextPage() );
}
}
}
]

[
#define EVERY_X_LOOPS 50 // is 100 normaal
#define EVERY_X_COUNTS 10 // is 10 normaal
int alivemin=0;
int alivesec=0;
int loopcounter=0;
volatile int count =0;
unsigned int lastcount=0;
unsigned long totalcount=0;
byte rpm;
byte richting;
byte snelheid;
unsigned int lastrpm=0;
unsigned long timeold=0;
unsigned long timenew=0;
boolean updatecount=false;
boolean updaterpm=false;


int pin =0; //ana input richting
int Time=0;
int StartTime=0;
int StopTime=0;
int analogValueMax=0;
int analogValueMin=1024;
int analogValue=0;
int ButtonPushCounter=0;
int ButtonState=0;
int LastButtonState=0;
int Frequency;
int i=0;
byte value;
int lampPin = 13;
const int regenInput =4;
const int ledPin = 2;
void setup()
{
pinMode(2,OUTPUT);
pinMode(4,INPUT);
pinMode(lampPin,OUTPUT);
Serial.begin(9600);

attachInterrupt(1,reedswitchInterrupt,FALLING);// was FALLING
int analogValue=0;
LastButtonState=0;
setupclock();
timeold=millis( );
digitalWrite(lampPin,LOW);
}

void reedswitchInterrupt()
{
count++;
}
void setupclock()
{

}

void updateclock()
{
alivesec++;
if (alivesec == 60)
{
alivemin++;
alivesec=0;
}
if (alivesec<10)
{

}

}

void loop()
{

value = analogRead (pin); // ana input richting
value /=4;


// Serial.print(",");
delay(1000);
loopcounter++;
if(count){
totalcount+=count;
lastcount+=count;
count=0;
updatecount =true;
}
if (loopcounter > EVERY_X_LOOPS || lastcount > EVERY_X_COUNTS){
updaterpm=true;
loopcounter=0;
}
if(updatecount){
updatecount=false;
}
if(updaterpm){
timenew = millis();
if(lastcount==0){
rpm=0;
}
else{
rpm=lastcount*int(60000 / (timenew-timeold));
lastcount=0;
}
timeold=timenew;

if(rpm!=lastrpm){

if(rpm<100&& lastrpm>= 100)
{

}
if(rpm<10&&lastrpm>=10)
{

}
lastrpm=rpm;
}
updaterpm=true;

}
if((loopcounter%10)==0){
updateclock();
}
Serial.print("<");// start byte
if ((analogRead(pin) >= 1)&&(analogRead(pin) <=100)){Serial.print("--WEST");}
if ((analogRead(pin) >=101)&&(analogRead(pin) <=160)){Serial.print("--ZUID");}
if ((analogRead(pin) >=161)&&(analogRead(pin) <=210)){Serial.print("Z-WEST");}
if ((analogRead(pin) >=211)&&(analogRead(pin) <=265)){Serial.print("-NOORD");}
if ((analogRead(pin) >=265)&&(analogRead(pin) <=330)){Serial.print("N-WEST");}
if ((analogRead(pin) >=330)&&(analogRead(pin) <=410)){Serial.print("--OOST");}
if ((analogRead(pin) >=410)&&(analogRead(pin) <=470)){Serial.print("Z-OOST");}
if ((analogRead(pin) >=470)&&(analogRead(pin) <=510)){Serial.print("N-OOST");}

Serial.print(",");

if(rpm>=0 && rpm<= 25) {Serial.print("<1");}
if(rpm>= 26 && rpm<= 50) {Serial.print("-2");}
if(rpm>= 51 && rpm<= 75) {Serial.print("-3");}
if(rpm>= 76 && rpm<=100) {Serial.print("-4");}
if(rpm>=101 && rpm<=125) {Serial.print("-5");}
if(rpm>=126 && rpm<=150) {Serial.print("-6");}
if(rpm>=151 && rpm<=175) {Serial.print("-7");}
if(rpm>=176 && rpm<=200) {Serial.print("-8");}
if(rpm>=201 && rpm<=225) {Serial.print("-9");}
if(rpm>=226 && rpm<=250) {Serial.print("10");}
if(rpm>=251 && rpm<=275) {Serial.print("11");}
if(rpm>=276 && rpm<=300) {Serial.print("12");}
if(rpm>=301) {Serial.print("13");}
// Serial.println(rpm);
delay(1000);

}

Voor verbeteringen ben ik altijd in.
ps. Ik weet niet om code bij te voegen. ga dat eerst maar eens uitzoeken.
Groet ilioSS
Kan ik een foto bijvoegen kom ik er op terug.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: serial byte naar display

Berichtdoor shooter » 12 Okt 2014, 15:08

er mag best wat commentaar instaan, en het is ook niet de complete listing (niet erg maar toch)


cpp code
[
void loop() {
Serial.begin(9600); //cs dit moet niet in de loop maar in setup
float temperature = getTemp();
while(Serial.available() > 0)
{
for ( int i=1; i<11; i++){
inByte= Serial.read();
if(inByte=='<');{
incomingByte[i] = inByte; //cs betekent dat de array telkens een < teken bevat
}
}

rValue1=(incomingByte[1]);
rValue2=(incomingByte[2]);
rValue3=(incomingByte[3]);
rValue4=(incomingByte[4]);
rValue5=(incomingByte[5]);
rValue6=(incomingByte[6]);
rValue7=(incomingByte[7]);
rValue8=(incomingByte[8]);
rValue9=(incomingByte[9]);
rValue10=(incomingByte[10]);

for ( int i=1; i<11; i++)
{

u8g.firstPage();
do {
u8g.setFont(u8g_font_04b_03);
u8g.setColorIndex(1);
// Teperature printen
u8g.setPrintPos(0,5);
u8g.print("Temp.");
u8g.print(temperature);
u8g.setPrintPos(40,5);
u8g.print(" C");
//Wind richting
u8g.setPrintPos(0,13);
u8g.print("Wind richting");
u8g.print(rValue2); //cs dit mag toch ook gelijk het incomingbyte zijn?
u8g.print(rValue3);
u8g.print(rValue4);
u8g.print(rValue5);
u8g.print(rValue6);
u8g.print(rValue7);
//Wind kracht in bft
u8g.setPrintPos(0,21);
u8g.print("Wind");
u8g.print(rValue9);
u8g.print(rValue10);
u8g.setPrintPos(27,21);
u8g.print("bft");
}
while( u8g.nextPage() );
}
}
}
]

[
#define EVERY_X_LOOPS 50 // is 100 normaal
#define EVERY_X_COUNTS 10 // is 10 normaal
int alivemin=0;
int alivesec=0;
int loopcounter=0;
volatile int count =0;
unsigned int lastcount=0;
unsigned long totalcount=0;
byte rpm;
byte richting;
byte snelheid;
unsigned int lastrpm=0;
unsigned long timeold=0;
unsigned long timenew=0;
boolean updatecount=false;
boolean updaterpm=false;


int pin =0; //ana input richting
int Time=0;
int StartTime=0;
int StopTime=0;
int analogValueMax=0;
int analogValueMin=1024;
int analogValue=0;
int ButtonPushCounter=0;
int ButtonState=0;
int LastButtonState=0;
int Frequency;
int i=0;
byte value;
int lampPin = 13;
const int regenInput =4;
const int ledPin = 2;
void setup()
{
pinMode(2,OUTPUT); //cs zet hier ledPin neer
pinMode(4,INPUT); //cs zet hier regenInput
pinMode(lampPin,OUTPUT);
Serial.begin(9600); //cs hier is het wel goed

attachInterrupt(1,reedswitchInterrupt,FALLING);// was FALLING
/* wellicht moet je nog wel een debounce erop zetten want die mega is supersnel dus als het contact dendert dan is de windsnelheid ineens te hoog, en een reedswitch staat erom bekend door de lage contactdruk */

int analogValue=0;
LastButtonState=0;
setupclock();
timeold=millis( );
digitalWrite(lampPin,LOW);
}

void reedswitchInterrupt()
{
count++;
}

void setupclock()
{

}

void updateclock()
{
alivesec++;
if (alivesec >= 60) //cs changed
{
alivemin++;
alivesec=0;
}
if (alivesec<10)
{

}

}

void loop()
{

value = analogRead (pin); // ana input richting
value /=4;


// Serial.print(",");
delay(1000);
loopcounter++;
if(count){
totalcount+=count;
lastcount+=count;
count=0;
updatecount =true;
}
if (loopcounter > EVERY_X_LOOPS || lastcount > EVERY_X_COUNTS){
updaterpm=true;
loopcounter=0;
}
if(updatecount){
updatecount=false;
}
if(updaterpm){
timenew = millis();
if(lastcount==0){
rpm=0;
}
else{
rpm=lastcount*int(60000 / (timenew-timeold));
lastcount=0;
}
timeold=timenew;

if(rpm!=lastrpm){

if(rpm<100&& lastrpm>= 100)
{

}
if(rpm<10&&lastrpm>=10)
{

}
lastrpm=rpm;
}
updaterpm=true;

}
if((loopcounter%10)==0){
updateclock();
}
Serial.print("<");// start byte
if ((analogRead(pin) >= 1)&&(analogRead(pin) <=100)){Serial.print("--WEST");}
if ((analogRead(pin) >=101)&&(analogRead(pin) <=160)){Serial.print("--ZUID");}
if ((analogRead(pin) >=161)&&(analogRead(pin) <=210)){Serial.print("Z-WEST");}
if ((analogRead(pin) >=211)&&(analogRead(pin) <=265)){Serial.print("-NOORD");}
if ((analogRead(pin) >=265)&&(analogRead(pin) <=330)){Serial.print("N-WEST");}
if ((analogRead(pin) >=330)&&(analogRead(pin) <=410)){Serial.print("--OOST");}
if ((analogRead(pin) >=410)&&(analogRead(pin) <=470)){Serial.print("Z-OOST");}
if ((analogRead(pin) >=470)&&(analogRead(pin) <=510)){Serial.print("N-OOST");}
//cs tabel zit helemaal verkeerd west, zuid west, zuid, zuid oost,oost,noordoost,noord,noordwest
simpeler is om het de reading /2 naar de andere kant te printen.

Serial.print(",");

if(rpm>=0 && rpm<= 25) {Serial.print("<1");}
if(rpm>= 26 && rpm<= 50) {Serial.print("-2");}
if(rpm>= 51 && rpm<= 75) {Serial.print("-3");}
if(rpm>= 76 && rpm<=100) {Serial.print("-4");}
if(rpm>=101 && rpm<=125) {Serial.print("-5");}
if(rpm>=126 && rpm<=150) {Serial.print("-6");}
if(rpm>=151 && rpm<=175) {Serial.print("-7");}
if(rpm>=176 && rpm<=200) {Serial.print("-8");}
if(rpm>=201 && rpm<=225) {Serial.print("-9");}
if(rpm>=226 && rpm<=250) {Serial.print("10");}
if(rpm>=251 && rpm<=275) {Serial.print("11");}
if(rpm>=276 && rpm<=300) {Serial.print("12");}
if(rpm>=301) {Serial.print("13");}
// hier hetzelfde


// Serial.println(rpm);
delay(1000);

}
paul deelen
shooter@home.nl

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: serial byte naar display

Berichtdoor ilioSS » 19 Okt 2014, 16:38

Beste Paul Deelen,

Hartelijk dank voor je reactie.
Ja het is belangrijk om scripts van goede aanwijzingen en commentaar te voorzien.
Ben je er mee bezig snap je het wel. Maar als je je script opstuurt dan is het nog maar de vraag of iemand anders het makkelijk kunt lezen.
Ook zelf na een tijdje heb je er moeite mee.
Dus ja je script van commentaar voorzien.
Ook gestructureerd programmeren is lastig. Nooit geleerd. Als het maat werkt.

Groet ilioss

ps. Met het serial verhaal ben ik nu goed geholpen. Nu wil ik mijn netwerk uitbreiden met nog een XBEE dus een echt netwerk.
Dit geeft weer de nodige uitdaging. Hoe krijg ik drie XBEE,s in een mesh met elkaar werkend.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: serial byte naar display

Berichtdoor shooter » 19 Okt 2014, 16:43

Hou het simpel en verstuur het bericht, naar de volgende xbee in afstand, en die verstuurd het dan weer naar de volgende, en dan naar het basisstation. die op zijn beurt een acknowledge verstuurt in omgekeerde volgorde (wel met een messageheader.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 89 gasten