Moin nochmal,
ich stell Dir einfach mal meinen Sketch hier rein (ist schon etwas her, dass ich den geschrieben habe, aber funktioniert hat er, soweit ich weiß), macht zwar nicht genau das, was Du möchtest, aber vielleicht ist es ein Denkanstoß:
Code:
//Windrichtung
#include <EEPROM.h>
#define Windrichtung A3
#define zeroset 3
int AWDroh = 0;
long AWD = 0;
long zeitnull = 0;
bool zeromerker = false;
int Einbaulage = 0;
//Windstaerke
#define Windstaerke 0
#define Windstaerkepin 2
#define Polpaare 6
#define Messintervall 1000
volatile int count = 0;
volatile long ZeitAWS = 0;
float AWSroh = 0;
float AWS = 0;
long dt = 0;
float UpS = 0;
//Display
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//Bluetooth
#include <SoftwareSerial.h>
SoftwareSerial BT(11,10);
char BTeingabe=0;
void setup()
{
Serial.begin(9600);
BT.begin(9600);
BT.println("Verbunden!");
lcd.begin(16,2);
lcd.backlight();
pinMode(Windrichtung, INPUT);
pinMode(zeroset, INPUT_PULLUP);
pinMode(Windstaerkepin,INPUT_PULLUP);
attachInterrupt(Windstaerke, Staerkezaehler, FALLING);
EEPROM.get(0,Einbaulage);
}
void Ausgabe()
{
char zeile1[17];
char zeile2[17];
char* AWDc[] = {" N", "NNO", " NO", "ONO",
" O", "OSO", " SO", "SSO",
" S", "SSW", " SW", "WSW",
" W", "WNW", " NW", "NNW"};
long Zeigerrichtung = 0;
int bft[] = {0,1,2,3,4,5,6,7,8,9,10,11,12};
int Bft=0;
Zeigerrichtung = (((((AWD*10000)-112500)+10000)/2250)+100)/100;
if (Zeigerrichtung>15)
{
Zeigerrichtung=0;
}
int AWS1=AWS*10;
float AWSkn=AWS*1.94;
int AWS1kn=AWSkn*10;
switch(AWS1)
{
case 0 ... 3:
Bft=bft[0];
break;
case 4 ... 16:
Bft=bft[1];
break;
case 17 ... 34:
Bft=bft[2];
break;
case 35 ... 55:
Bft=bft[3];
break;
case 56 ... 80:
Bft=bft[4];
break;
case 81 ... 108:
Bft=bft[5];
break;
case 109 ... 139:
Bft=bft[6];
break;
case 140 ... 172:
Bft=bft[7];
break;
case 173 ... 208:
Bft=bft[8];
break;
case 209 ... 245:
Bft=bft[9];
break;
case 246 ... 285:
Bft=bft[10];
break;
case 286 ... 327:
Bft=bft[11];
break;
default: Bft=bft[12];
}
sprintf(zeile1,"Wind: %03i\xdf", AWD);
sprintf(zeile2,"%2i Bft %2i.%1i kn",Bft, AWS1kn/10,AWS1kn%10);
lcd.setCursor(0,0);
lcd.print(zeile1);
lcd.setCursor(13,0);
lcd.print(AWDc[Zeigerrichtung]);
lcd.setCursor(0,1);
lcd.print(zeile2);
/*lcd.print("AWS ");
lcd.print(AWS);
lcd.setCursor(13,1);
lcd.print("m/s");
*/
Serial.println(zeile1);
//Serial.print(AWDroh);
Serial.println(AWDc[Zeigerrichtung]);
Serial.println(zeile2);
BT.print(zeile1);
BT.print(AWDc[Zeigerrichtung]);
BT.println(zeile2);
delay(1000);
}
void BTVerbindung()
{
if (BT.available())
{
BTeingabe=BT.read();
Serial.println(BTeingabe);
if (BTeingabe=='z')
{
Einbaulage=AWDroh;
BTeingabe=0;
}
}
}
void Nullstellung()
{
if (digitalRead(zeroset) == LOW)
{
zeitnull = millis();
zeromerker = true;
}
if (millis()-zeitnull > 100 && zeromerker == true)
{
EEPROM.put(0,AWDroh);
Einbaulage=AWDroh;
zeromerker = false;
}
}
void Richtung()
{
AWDroh = map(analogRead(Windrichtung),0,1023,0,360);
if (AWDroh - Einbaulage >= 360)
{
AWD = AWDroh - Einbaulage - 360;
}
else if (AWDroh - Einbaulage < 0)
{
AWD = AWDroh - Einbaulage + 360;
}
else
{
AWD = AWDroh - Einbaulage;
}
}
void Staerkezaehler()
{
count++;
}
void Staerke()
{
if (millis()-ZeitAWS >= Messintervall)
{
AWSroh = (float)count/Polpaare;
dt = millis()-ZeitAWS;
UpS= AWSroh*1000/dt;
AWS = UpS*0.62+0.2;
if (AWS<=0.2){AWS=0;}
ZeitAWS=millis();
count=0;
}
}
void loop()
{
Richtung();
Staerke();
Ausgabe();
Nullstellung();
BTVerbindung();
}
Ist halt auch viel drin, was Du nicht brauchst, aber zumindest hat er über BT was übertragen.
Grüße Jan