INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Negativ und Positiv
18.12.2015, 20:07
Beitrag #1
Negativ und Positiv
Ich habe eine Wetterstation mit einem ENC28J60 Ethernet Adapter gebaut. Es funktioniert alles super, ausser das ich keine Minus Werte darstellen kann. Also möglich ist es schon, nur das der Webserver dann irgendetwas mit 65000 ausspuckt (overflow). Da ich keine floats will sondern nur Int, wollte ich immer wenn die Temperatur positiv ist, ein Plus vor den Temperaturwert schreiben. Bei Negativ sollte ein Minuszeichen davor stehen. (Aussentemperatur). All meine Versuche dazu schlugen fehl. Kann mir jemand helfen?

Zitat:// DHT code from:
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include <Wire.h>
#include "Adafruit_MCP9808.h"
#include <LiquidCrystal.h>
#include <SFE_BMP180.h>
#include "HTU21D.h"

Adafruit_MCP9808 tempsensor = Adafruit_MCP9808();
SFE_BMP180 pressure;
#define ALTITUDE 813.0
HTU21D myHumidity;
HTU21D myHumidity2;



LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// EtherCard code from the RBBB Example
// This is a demo of the RBBB running as webserver with the Ether Card
// 2010-05-28 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,130 };
static byte gwip[] = { 192,168,1,1 };
byte Ethernet::buffer[500];
BufferFiller bfill;

// The Animation loop is to provide some bling to the LCD diaplay

int t=0;
int h=0;
int t1=0;
int h1=0;
int P=0;
int P1=0;
int T=0;
int T1=0;
int raindetect=0;
int raindetect1=0;
int sensorValue1 = 0;
int sensorValue2 = 0;
int lux2 = 0;
int lux3 = 0;
int Timer= 0;
int Animation = 0;
int humd1= 0;
int humd11 = 0;
int humd1in= 0;
int humd1in1 = 0;

int tau1= 0;
int tau2 = 0;

int n;
int y;
int z;
int ao;
int xy;

float ab;
float b;
float maxtempo;
float mintempo;
float maxtempi;
float mintempi;
float maxluft;
float minluft;
float maxhumd1;
float minhumd1;
float maxtau;
float mintau;
float maxhumd1in;
float minhumd1in;
float pt;
float ptendenz2;



// Global Variables Defined
// This is so we can see them in all functions
// t is the temperature, h is the humidity
// Timer is used to reduce the frequency of reading the DHT11 - I found reading it every loop
// caused timing issues with the Ethernet.
// The Animation loop is to provide some bling to the LCD diaplay




// Setup - bring Ethernet, LCD and DHT11 live
void setup () {
if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)
Serial.begin(9600);
Serial.println( "Failed to access Ethernet controller");
ether.staticSetup(myip, gwip);
lcd.begin(16,2);
Serial.begin(9600);
Serial.println("MCP9808 demo");
n = 0;
y = 3;
z = 4;
ao = 5;
xy = 0;

maxtempo = 0;
mintempo = 100;
maxtempi = 0;
mintempi = 100;
maxluft = 0;
minluft = 1000;
maxhumd1 = 0;
minhumd1 = 1000000;
maxtau = 0;
mintau = 100;
maxhumd1in = 0;
minhumd1in = 1000000;

pt = 100;
ptendenz2 = 101;

tempsensor.begin();

myHumidity.begin();
myHumidity2.begin();
pinMode(15, OUTPUT);

if (pressure.begin())
Serial.println("BMP180 init success");
else
{
// Oops, something went wrong, this is usually a connection problem,
// see the comments at the top of this sketch for the proper connections.

Serial.println("BMP180 init fail\n\n");
while(1); // Pause forever.
}
}




// Here we build a web page and pass the t and h values into it
static word homePage() {
//ReadDHT11();

long t = millis() / 1000;
word h = t / 3600;
byte m = (t / 60) % 60;
byte s = t % 60;



bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n"
"\r\n"
"<meta http-equiv='refresh' content='3'/>"
"<title>Arduino Wetterstation</title>"
"<h1>Aussentemp.: $D Grad <br>Druck: $D HPa <br>Innentemp.: $D Grad <br>Regen: $D <br>Licht: $D Lux <br>Aussenfeuchtigkeit: $D % <br>Innenfeuchtigkeit: $D % <br>Taupunkt: $D Grad <br> Zeit: $D$D:$D$D:$D$D </h1>"),
t1, P1,T1, raindetect1, lux3, humd11, humd1in1, tau2, h/10, h%10, m/10, m%10, s/10, s%10);
return bfill.position();
}

// The main loop
// We add to the timer and read the DHT11 values when Timer == 1, otherwise we loop without reading it
// Once the Timer value == to 1100 we zero it and start the count again. This way the sensors are only
// read once every 1100 loops. Every time we go through the loop we listen for a request on the Ethernet
// If we see one we send the webpage. We also add an animation on the LCD so we know the loop is working.

void loop () {




Timer = Timer+1;
if(Timer==1)
{

float t = tempsensor.readTempC();
int raindetect = analogRead(A3);
int sensorValue1 = analogRead(A2);
float lux2 = sensorValue1 * 108.613;
float h = t * 9.0 / 5.0 + 32;
digitalWrite(15, HIGH);
float humd1 = myHumidity.readHumidity();
digitalWrite(15, LOW);
float humd1in = myHumidity2.readHumidity();

if (humd1 > 100) {
humd1 = 100;

} else {

}

if (humd1in > 100) {
humd1in = 100;

} else {

}

char status;
double T,P;
float ab = 17.271;
float b = 237.7;
float taupunktTemp = (ab * t) / (b + t) + log(humd1/100);
float tau1 = (b * taupunktTemp) / (ab - taupunktTemp);

status = pressure.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);

// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.
// Function returns 1 if successful, 0 if failure.

status = pressure.getTemperature(T);
if (status != 0)
{



status = pressure.startPressure(3);
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);

// Retrieve the completed pressure measurement:
// Note that the measurement is stored in the variable P.
// Note also that the function requires the previous temperature measurement (T).
// (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
// Function returns 1 if successful, 0 if failure.

status = pressure.getPressure(P,T);
if (status != 0)
{


}
else Serial.println("error retrieving pressure measurement\n");
}
else Serial.println("error starting pressure measurement\n");
}
else Serial.println("error retrieving temperature measurement\n");
}
else Serial.println("error starting temperature measurement\n");


// set the cursor to (0,0):
lcd.setCursor(0, 0);
t1 = t;
h1 = h;
P1 = P;
T1 = T;
raindetect1 = raindetect;
sensorValue2 = sensorValue1;
lux3 = lux2;
humd11 = humd1;
humd1in1 = humd1in;
tau2 = tau1;
// print from 0 to 9:


float P2 = (P + 94);
int x;
x = analogRead (0);
if ((x > 200) && (x < 400)) {
y = y + 3;
lcd.setCursor(13,1);
lcd.print(" ");
z = 4;
ao = 5;
} else {

}

if ((x < 200) && (x > 60)) {
y = y - 3;
lcd.setCursor(13,1);
lcd.print(" ");
z = 4;
ao = 5;
} else {

}
if ((x < 600) && (x > 400)) {
z = z + 3;
} else {

}

if ((x < 800) && (x > 600)) {
ao = ao + 4;

} else {

}

if ((y < 4) && (y > 2)) {
lcd.setCursor(0,0);
lcd.print("Wetterstation ");
lcd.setCursor(0,1);
lcd.print("Version 15.11.15");
} else {

}

if ((((y < 7) && (y > 5) && (ao < 6) && (ao > 4)))) {
lcd.setCursor(0,0);
lcd.print("Aussen.Temp ");
lcd.setCursor(0,1);
lcd.print(t,1);
lcd.print(" Grad ");
lcd.print("");
lcd.setCursor(15,0);


} else {

}



if ((((y < 7) && (y > 5) && (ao < 10) && (ao > 8)))) {
lcd.setCursor(0,0);
lcd.print("Max: ");
lcd.print(maxtempo,1 );
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(mintempo,1 );
lcd.setCursor(15,0);


} else {

}

if ((((((y < 10) && (y > 8) && (ao < 6) && (ao > 4)))))) {
lcd.setCursor(0,0);
lcd.print("Innentemperatur");
lcd.setCursor(0,1);
lcd.print(T,1);
lcd.print(" Grad ");
lcd.print("");
lcd.setCursor(15,0);



} else {

}



if ((((y < 10) && (y > 8) && (ao < 10) && (ao > 8)))) {
lcd.setCursor(0,0);
lcd.print("Max: ");
lcd.print(maxtempi,1 );
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(mintempi,1 );
lcd.setCursor(15,0);



} else {

}


if (xy < 3600) {
xy = xy + 1;



} else {


xy = 0;
pt = P;
}

ptendenz2 = P - pt;


if ((((((y < 13) && (y > 11) && (z < 5) && (z > 3) && (ao < 6) && (ao > 4)))))) {
lcd.setCursor(0,0);
lcd.print("Luftdruck (REL) ");
lcd.setCursor(0,1);
lcd.print(P,2);
lcd.print("/");
lcd.print(ptendenz2);
lcd.print(" HPa ");
lcd.setCursor(15,0);


} else {

}

if ((((((y < 13) && (y > 11) && (z < 8) && (z > 6) && (ao < 6) && (ao > 4)))))) {
lcd.setCursor(0,0);
lcd.print("Luftdruck (ABS) ");
lcd.setCursor(0,1);
lcd.print(P2,2);
lcd.print(" HPa ");
lcd.setCursor(15,0);


} else {
}

if ((((y < 13) && (y > 11) && (ao < 10) && (ao > 8)))) {
lcd.setCursor(0,0);
lcd.print("Max: ");
lcd.print(maxluft,2 );
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(minluft,2 );
lcd.print(" ");
lcd.setCursor(15,0);

} else {

}


if ((y < 16) && (y > 14)) {
lcd.setCursor(0,0);
lcd.print("Helligkeit ");
lcd.setCursor(0,1);
lcd.print(lux2,0);
lcd.print(" lx ");
lcd.setCursor(15,0);


} else {

}

if ((((y < 19) && (y > 17) && (ao < 6) && (ao > 4)))) {
lcd.setCursor(0,0);
lcd.print("Aus. Feuchtig. ");
lcd.setCursor(0,1);
lcd.print(humd1,1);
lcd.print(" % ");
lcd.setCursor(15,0);


} else {
}

if ((((y < 19) && (y > 17) && (ao < 10) && (ao > 8)))) {
lcd.setCursor(0,0);
lcd.print("Max: ");
lcd.print(maxhumd1,1 );
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(minhumd1,1 );
lcd.setCursor(15,0);


} else {

}

if ((((y < 22) && (y > 20) && (ao < 6) && (ao > 4)))) {
lcd.setCursor(0,0);
lcd.print("Taupunkt ");
lcd.setCursor(0,1);
lcd.print(tau1,1);
lcd.print(" Grad ");
lcd.print("");
lcd.setCursor(15,0);



} else {

}



if ((((y < 22) && (y > 20) && (ao < 10) && (ao > 8)))) {
lcd.setCursor(0,0);
lcd.print("Max: ");
lcd.print(maxtau,1 );
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(mintau,1 );
lcd.setCursor(15,0);



} else {

}


if ((((((raindetect > 1000) && (y < 25) && (y > 22) && (ao < 6) && (ao > 4)))))) {

lcd.setCursor(0,0);
lcd.print("Regendetektor");
lcd.setCursor(0,1);
lcd.print("Kein Regen ");
lcd.setCursor(15,0);




} else {

}

if ((((((raindetect < 1000) && (y < 25) && (y > 22) && (ao < 6) && (ao > 4)))))) {
lcd.setCursor(0,0);
lcd.print("Regendetektor");
lcd.setCursor(0,1);
lcd.print("Regen ");
lcd.setCursor(15,0);




} else {

}


if ((((y < 28) && (y > 25) && (ao < 6) && (ao > 4)))) {
lcd.setCursor(0,0);
lcd.print("In. Feuchtig. ");
lcd.setCursor(0,1);
lcd.print(humd1in ,1);
lcd.print(" % ");
lcd.setCursor(15,0);


} else {
}

if ((((y < 28) && (y > 25) && (ao < 10) && (ao > 8)))) {
lcd.setCursor(0,0);
lcd.print("Max: ");
lcd.print(maxhumd1in,1 );
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(minhumd1in,1 );
lcd.setCursor(15,0);


} else {

}




if (y > 29) {
y = y - 3;
} else {
}

if (y < 1) {
y = y + 3;
} else {
}

if (z > 8) {
z = z - 6;
} else {
}

if (ao > 10) {
ao = ao - 8;
} else {
}



float tempo = t;
float tempi = T;
float luft = P;
float humdmaxmin1 = humd1;
float humdmaxmin1in = humd1in;
float taupunktminmax = tau1;

if (tempo > maxtempo) {

maxtempo = tempo;


} else {



}

if (tempo < mintempo) {

mintempo = tempo;


} else {



}

if (tempi > maxtempi) {

maxtempi = tempi;


} else {



}

if (tempi < mintempi) {

mintempi = tempi;


} else {



}

if (luft > maxluft) {

maxluft = luft;


} else {



}

if (luft < minluft) {

minluft = luft;


} else {



}

if (humdmaxmin1 > maxhumd1) {

maxhumd1 = humdmaxmin1;


} else {



}

if (humdmaxmin1 < minhumd1) {

minhumd1 = humdmaxmin1;


} else {



}

if (taupunktminmax > maxtau) {

maxtau = taupunktminmax;


} else {



}

if (taupunktminmax < mintau) {

mintau = taupunktminmax;


} else {



}

if (humdmaxmin1in > maxhumd1in) {

maxhumd1in = humdmaxmin1in;


} else {



}

if (humdmaxmin1in < minhumd1in) {

minhumd1in = humdmaxmin1in;


} else {



}
}


if(Timer==15000)
{
Timer=0;
}


word len = ether.packetReceive();
word pos = ether.packetLoop(len);

if (pos) // check if valid tcp data is received
{
ether.httpServerReply(homePage()); // send web page data
}



}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2015, 20:28 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2015 20:28 von arduino_weatherstation.)
Beitrag #2
RE: Negativ und Positiv
Bei dieser Stelle:



bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n"
"\r\n"
"<meta http-equiv='refresh' content='3'/>"
"<title>Arduino Wetterstation</title>"
"<h1>Aussentemp.: $D Grad <br>Druck: $D HPa <br>Innentemp.: $D Grad <br>Regen: $D <br>Licht: $D Lux <br>Aussenfeuchtigkeit: $D % <br>Innenfeuchtigkeit: $D % <br>Taupunkt: $D Grad <br> Zeit: $D$D:$D$D:$D$D </h1>"),
t1, P1,T1, raindetect1, lux3, humd11, humd1in1, tau2, h/10, h%10, m/10, m%10, s/10, s%10);
return bfill.position();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2015, 21:16
Beitrag #3
RE: Negativ und Positiv
Der Arduino mag eine Integer Variable ganz gut im negativen Bereich verarbeiten.
Ob das dann auch für das Drumherum gilt?
Offenbar nicht.

Irgendwo scheint es zum Überlauf zu kommen, daher die falschen Zahlen.


Zwei Möglichkeiten:
1.
Dafür Sorgen, das alle Zahlen im Positiven Bereich bleiben und erst in letzter Instanz umrechnen.
(Fahrenheit nehmen, oder von -500 aufwärts gehen, dann wäre 0 =-50.0 Grad und 600 =+10.0 Grad)

2. die Errechnete Temperatur in einen String wandeln und Diesen dann weitergeben.

Um das jetzt auzubaldovern, würde ich einen Sketch schreiben, der einzig und allein eine "Temperatur" simuliert und mir nur diese anzeigen lassen.
Zum einen per Serial.println()
Zum anderen in dem HTML


Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2015, 21:40
Beitrag #4
RE: Negativ und Positiv
Das Problem ist, dass es ein unsigned int ist. Das heisst, dass er Zahlen unter 0 nicht verarbeiten kann. Die 2. Methode sieht interessanter aus. Weiss jemand wie man dies macht? Bei mir produziert das komische Zeichen anstatt Buchstaben
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2015, 21:48
Beitrag #5
RE: Negativ und Positiv
Na wenn die unsigned int nicht negativ kann, dann addiere vorher 500, schreib die Summe in eine INT und zieh dann die 500 wieder ab.
Zur Anzeige dann natürlich durch 10 teilen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2015, 21:57
Beitrag #6
RE: Negativ und Positiv
Aber dann habe ich im ENdeffekt ja trotzdem eine negative Zahl.

Beispiel:

Temperatur: 1. 23 Grad Celsius = 23 Grad auf dem Webserver
2. -23 Grad Celsius = 65535-23 Grad = 65512 Grad auf dem Webserver
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste