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:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Warum wird if nicht ausgeführt??
01.09.2015, 20:16 (Dieser Beitrag wurde zuletzt bearbeitet: 01.09.2015 20:18 von Wampo.)
Beitrag #1
Warum wird if nicht ausgeführt??
Hy,

in dem folgenden Code wird die if Anweisung if(i < settings.analog_min) nicht ausgeführt, kann mir einer sagen warum?
Es sollte ja der strip.setBrightness(i) auf 10 gesetzt werden wenn der if(i < settings.analog_min) unter 25 ist, aber er machts nicht.
Ich finde keinen Fehler.

Code:
if((ms - ms_ldr) > 50) //every ??? msek
{
ms_ldr = ms;
total = total - readings[index];        
  readings[index] = analogRead(LDR_READ_PIN);
  // add the reading to the total:
  total = total + readings[index];      
  // advance to the next position in the array:  
  index = index + 1;                    
  // if we're at the end of the array...
  if (index >= numReadings) {            
    // ...wrap around to the beginning:
    index = 0; }                          
  // calculate the average:
  i = total / numReadings;
    
if(i < settings.analog_min)
{
i = settings.brightness_min;
}
else if(i > settings.analog_max)
{
i = settings.brightness_max;
}
else
{
i = map(i, settings.analog_min, settings.analog_max, settings.brightness_min, settings.brightness_max);
}
strip.setBrightness(i); //0...255
Serial.print("PWM: ");
Serial.print(i);
Serial.print("   ");
Serial.print("LDR: ");
Serial.println(analogRead(LDR_READ_PIN));
strip.show();
}

Danke Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.09.2015, 20:48
Beitrag #2
RE: Warum wird if nicht ausgeführt??
Es ist schwer, den Code zu durchschauen, da die Deklaration der Variablen fehlt. Kannst du nicht den kompletten Anfang mitliefern?

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.09.2015, 20:57 (Dieser Beitrag wurde zuletzt bearbeitet: 01.09.2015 21:22 von Wampo.)
Beitrag #3
RE: Warum wird if nicht ausgeführt??
Das wäre das komplette Programm
Die Variablen settings sind voreingestellte werte die im EEPROM unter anderem gespeichert werden.
Und ich muss nochmal korregieren...Es wird gar keine anweisung ausgeführt weder MIN noch MAX sondern nur das Mapping

Code:
/*
Corona Clock by Editet by Daniel Agocs

V1.0: Fehler in der Ausgabe des Brightnesswertes = Wurde angepasst nun werden die vom LDR gelesenen Werte 0-1024 auf 0-255 richtig aufgerechnet
V1.0.5: Vorversion: Bluetoothverbindung & Eingabemöglichkeit über dafür geschriebene App (Android), App-Anfrage über: daniel_agocs@yahoo.de, kleine Bugfixes
*/


/*
d24.12.2013 -> date: dd.mm.yyyy
t12:10 -> time: hh:mm
c0 -> clock mode: 0,1,2,3,4,5,6
o0,0,0 -> off color: r,g,b
h255,0,0 -> hour color: r,g,b
m0,255,0 -> minute color: r,g,b
s0,0,255 -> second color: r,g,b
M100,100,100 -> mark color: r,g,b
b5 -> brightness min: 0...255
B255 -> brightness max: 0...255
a0 -> analog min: 0...1023
A1023 -> analog max: 0...1023
*/
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); //RX || TX
#include <Adafruit_NeoPixel.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307.h>
#include <avr/eeprom.h>
#define PIXEL_12OCLOCK 0 //first pixel (12 o'clock)
#define DATA_PIN 6 //data pin from stripe
#define NUM_PIXEL 60

#define LDR_READ_PIN A0
#define MQ7_PIN A1

Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float druck;
float temperature;

//Verfeinerung der gelesenen Werte des LDR
const int numReadings = 10;          // wieviel LDR Werte
int       readings[numReadings];     // analog input lesen
int       index = 0;                 // index der aktuellen lesung
int       total = 0;                 // Total Runs
int sensorValue = 0;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, DATA_PIN, NEO_GRB + NEO_KHZ800);
DS1307 rtc; //RTC connected via I2C (SDA+SCL)
typedef struct
{
uint8_t r;
uint8_t g;
uint8_t b;
} COLOR;
typedef struct
{
uint8_t magic; //0xAA
uint8_t clock_mode;
COLOR hour;
COLOR minute;
COLOR second;
COLOR mark;
COLOR off;
uint8_t brightness_min;
uint8_t brightness_max;
uint16_t analog_min;
uint16_t analog_max;
} SETTINGS;
SETTINGS settings;


void setup()
{
  Serial.begin(9600);
BT.begin(9600);  
strip.begin();
bmp.begin();
rtc.start();
pinMode(LDR_READ_PIN, INPUT);
pinMode(MQ7_PIN,INPUT);
//analogReference(EXTERNAL);

//read settings from EEPROM
eeprom_read_block((void*)&settings, 0, sizeof(SETTINGS));
if((settings.magic != 0xAA) || (settings.brightness_min >= settings.brightness_max) || (settings.analog_min >= settings.analog_max))
{
//set default settings
settings.magic = 0xAA;
settings.clock_mode = 1;
settings.hour.r = 255;
settings.hour.g = 0;
settings.hour.b = 0;
settings.minute.r = 0;
settings.minute.g = 255;
settings.minute.b = 0;
settings.second.r = 0;
settings.second.g = 0;
settings.second.b = 255;
settings.mark.r = 255;
settings.mark.g = 255;
settings.mark.b = 255;
settings.off.r = 0;
settings.off.g = 0;
settings.off.b = 0;
settings.brightness_min = 10;
settings.brightness_max = 255;
settings.analog_min = 20;
settings.analog_max = 900;
//write settings to EEPROM
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));

rtc.set(00, 30, 00, 16, 02, 2015); //12:00:00 24.12.2013 (sec, min, hour, day, month, year)
}

for(byte i=0; i<NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel((256 / NUM_PIXEL) * i));
    strip.show();
    delay(25);
  }
}

void set_pixel(uint8_t p, uint8_t r, uint8_t g, uint8_t b) //set pixel p (0...59) with color r,g,b
{
if(p == 255){ p = 59; }
else if(p == 60){ p = 0; }
p = p + PIXEL_12OCLOCK;
if(p >= 60)
{
p -= 60;
}
strip.setPixelColor(p, r, g, b);
}

void set_clock1(uint8_t s, uint8_t m, uint8_t h)
{
uint8_t i;
if(h >= 12) { h -= 12; }

clearStrip();

//set hour
for(i=0; i<60; i++)
{
if(i == ((h*5)+(m/12)))
{
set_pixel(i-1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
set_pixel(i+0, settings.hour.r, settings.hour.g, settings.hour.b);
set_pixel(i+1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
}
}

//set second and minute
for(int i=0; i<60; i += 15) {
        strip.setPixelColor(i, settings.mark.r/4, settings.mark.g/4, settings.mark.b/4);
      }
for(i=0; i<60; i++)
{
if(i == s)
{
set_pixel(i, settings.second.r, settings.second.g, settings.second.b);
}
else if(s == m)
{
set_pixel(s, (settings.second.r+settings.minute.r), (settings.second.g+settings.minute.g), (settings.second.b+settings.minute.b));
}
else if(i == m)
{
set_pixel(i, settings.minute.r, settings.minute.g, settings.minute.b);
}
}

strip.show();
}

void loop()
{
int c, i, r, g, b;
int s, m, h, day, month, year;
unsigned long ms;
static unsigned int last_analog=0;
static unsigned long ms_clock=0, ms_ldr=0;
char tmp[32];



if (( m == 15 || m == 30 || m == 45) && s == 0)
{
  int z=0;
for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 15; q++) {
      for (int i=0; i < strip.numPixels(); i=i+15) {
      
        strip.setPixelColor(i+q, wheel(((256 / NUM_PIXEL)*z)*255)+5);    //turn every third pixel on
     }
     strip.show();
     delay(35);
     z++;
      for (int i=0; i < strip.numPixels(); i=i+15) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
  z=0;
}

else if ((m == 00 && s == 00))
{
  for(byte i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
  rainbowCycle(4,3); //durchläufe, geschwindigkeit
  
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
    delay(25);
  }
  for(byte i = 0; i < NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
}


//current milliseconds since power on
ms = millis();
//get time from RTC and set LEDs
if((ms - ms_clock) > 1000)
{
ms_clock = ms;

rtc.get(&s, &m, &h, &day, &month, &year);

//Programmauswahl was über BT angewählt wurde
switch(settings.clock_mode){

case 0:
clearStrip();   //Uhr aus, Strip hat keine Anzeige
break;

case 1:
set_clock1(s, m, h);   //Standart Uhr Anzeige
break;

case 2:
tempdruck();    //Temperatur und Druckanzeige
break;

case 3:
AIRQ();    //Luftqualitätsanzeige
break;

case 4:
CandyCane(10,10,26);    //VU Meter
break;

case 5:
rainbowCycle(1,15);            //Moodlight
break;
}
}

//check light intensity (LDR)
if((ms - ms_ldr) > 50) //every ??? msek
{
ms_ldr = ms;
total = total - readings[index];        
  readings[index] = analogRead(LDR_READ_PIN);
  // add the reading to the total:
  total = total + readings[index];      
  // advance to the next position in the array:  
  index = index + 1;                    
  // if we're at the end of the array...
  if (index >= numReadings) {            
    // ...wrap around to the beginning:
    index = 0; }                          
  // calculate the average:
  i = total / numReadings;
    
if(i < settings.analog_min)
{
i = settings.brightness_min;
}
else if(i > settings.analog_max)
{
i = settings.brightness_max;
}
else
{
i = map(i, settings.analog_min, settings.analog_max, settings.brightness_min, settings.brightness_max);
}
strip.setBrightness(i); //0...255
Serial.print("PWM: ");
Serial.print(i);
Serial.print("   ");
Serial.print("LDR: ");
Serial.println(analogRead(LDR_READ_PIN));
strip.show();
}


//check serial data
if(BT.available() > 1)
{
//read serial data
for(i=0; (BT.available()>0) && (i<31);)
{
tmp[i++] = BT.read();
tmp[i] = 0;
delay(5); //wait to receive data
}
//get current time and date
rtc.get(&s, &m, &h, &day, &month, &year);
//interpret commands
c = 0;
switch(tmp[0])
{
case 'd': //date
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &day, &month, &year))
{
c = 1; //set rtc

}
break;
case 't': //time
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &h, &m, &s))
{
c = 1; //set rtc

}
break;
case 'o': //off color
case 'h': //hour color
case 'm': //minute color
case 's': //second color
case 'M': //mark color
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &r, &g, &b))
{
switch(tmp[0])
{
case 'o':
settings.off.r = r;
settings.off.g = g;
settings.off.b = b;
break;
case 'h':
settings.hour.r = r;
settings.hour.g = g;
settings.hour.b = b;
break;
case 'm':
settings.minute.r = r;
settings.minute.g = g;
settings.minute.b = b;
break;
case 's':
settings.second.r = r;
settings.second.g = g;
settings.second.b = b;
break;
case 'M':
settings.mark.r = r;
settings.mark.g = g;
settings.mark.b = b;
break;
}
c = 2; //save settings
}

break;
case 'c': //clock mode
case 'b': //brightness min
case 'B': //brightness max
case 'a': //analog min
case 'A': //analog max
if(sscanf(&tmp[1], "%d", &i))
{
switch(tmp[0])
{
case 'c': settings.clock_mode = i; break;
case 'b': settings.brightness_min = i; break;
case 'B': settings.brightness_max = i; break;
case 'a': settings.analog_min = i; break;
case 'A': settings.analog_max = i; break;
}
c = 2; //save settings
}

break;
}

if(c == 1) //set RTC/clock
{
rtc.set(s, m, h, day, month, year);
}
else if(c == 2) //write settings to EEPROM
{
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));
}
//clear serial buffer
BT.flush();
}


}



//Licht-Effekte-------------------------------------------------------------------
void CandyCane  (int sets,int width,int wait) {
  int L;
    for(int j=0;j<(sets*width);j++) {
    for(int i=0;i< strip.numPixels();i++) {
      L=strip.numPixels()-i-1;
      if ( ((i+j) % (width*2) )<width)
        strip.setPixelColor(L, 0, 0, 255);
      else
        strip.setPixelColor(L, 255, 255, 255);
    }  
    strip.show();
    delay(wait);
  }
}

void rainbowCycle(uint8_t sets, uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*sets; j++) { //cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(strip.numPixels()-i-1, wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}


//-----------------------------------------------------------------------------------

//Unterprogramme---------------------------------------------------------------------
void tempdruck() {

  sensors_event_t event;
  bmp.getEvent(&event);  // BMP085 Luftruck ziehen
  druck = event.pressure  + ( 509 / 8.5 ); // höhe 509
  bmp.getTemperature(&temperature);
  clearStrip();
   int d = map(druck, 960, 1060, 1, 29);
    for(uint16_t R= 0; R<d; R++) {
      strip.setPixelColor(1+R,wheel(((85-(R*3)) & 255)));
   }
  int t = map(temperature, 10, 40, 1, 29);
    for(uint16_t L = 0; L<t; L++) {
      strip.setPixelColor(31+L,wheel(((170+(L*6)) & 255)));
  }
  for(int i=0; i<60; i += 30) {
        strip.setPixelColor(i,255,255,240);
  }
  Serial.println("Temp     Druck");
  Serial.print(temperature);
  Serial.print("      ");
  Serial.println(druck);
  
strip.show();
  }
  
  void AIRQ() {
  int level = map(analogRead(MQ7_PIN), 10, 500, 1, NUM_PIXEL);
  Serial.print("AirQ: ");
  Serial.println(analogRead(MQ7_PIN));
  clearStrip();
    for(uint16_t L = 0; L<level; L++) {
    
      strip.setPixelColor(1+L,wheel((((L*2)) & 255)));
      strip.setPixelColor(0,255,255,255);
  }
   strip.show(); // Ausgabe auf Strip
  
}
  
//-----------------------------------------------------------------------------------

//R-G-B Farbrad / Pixelhelpers-------------------------------------------------------
uint32_t wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void clearStrip(){
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.09.2015, 22:21
Beitrag #4
RE: Warum wird if nicht ausgeführt??
Kann es sein, das sich in diesem Teil
Code:
ms_ldr = ms;
total = total - readings[index];        
   readings[index] = analogRead(LDR_READ_PIN);
   // add the reading to the total:
   total = total + readings[index];      
   // advance to the next position in the array:  
   index = index + 1;                    
   // if we're at the end of the array...
   if (index >= numReadings) {            
     // ...wrap around to the beginning:
     index = 0; }                          
   // calculate the average:
   i = total / numReadings;
ein Fehler befindet.

Speziell hier: i = total / numReadings;

Welchen Wert enthält "i" beim Verlassen dieser If-Anweisung?

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.09.2015, 18:02 (Dieser Beitrag wurde zuletzt bearbeitet: 03.09.2015 18:12 von Wampo.)
Beitrag #5
RE: Warum wird if nicht ausgeführt??
(01.09.2015 22:21)hotsystems schrieb:  Kann es sein, das sich in diesem Teil
Code:
ms_ldr = ms;
total = total - readings[index];        
   readings[index] = analogRead(LDR_READ_PIN);
   // add the reading to the total:
   total = total + readings[index];      
   // advance to the next position in the array:  
   index = index + 1;                    
   // if we're at the end of the array...
   if (index >= numReadings) {            
     // ...wrap around to the beginning:
     index = 0; }                          
   // calculate the average:
   i = total / numReadings;
ein Fehler befindet.

Speziell hier: i = total / numReadings;

Welchen Wert enthält "i" beim Verlassen dieser If-Anweisung?

Das ist ja eben meine Frage, wo ist der Fehler, ich kann keinen entdecken, meiner meinung nach ist alles stimmig.
numReadings wird vorm setup Initialisiert mit 10 Lesungen
total errechnet sich durch die Arraywerte und menge der array (durchnschnitt)
und i wird doch bei jedem neuen run überschrieben aus dem wert der sich aus total / numreadings ergibt.
Sind dann die berechnungen richtig wird i an die if anweisung übergeben aber da is der hund begraben die if anweiung wird iwie nicht ausgeführt.
Das die Werte sauber übergeben werden bin ich mir sicher siehe Screenshot, es wird ja auch das Mapping (Analog auf PWM) ausgeführt in der if Anweisung.
   
Ich muss doch hier nicht i bei jedem run neu initialisieren geschweige denn nullen?!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.09.2015, 21:59
Beitrag #6
RE: Warum wird if nicht ausgeführt??
Ich habe mir den Code nochmal angesehen und mir ist aufgefallen, du verwendest die Variable "i" mehrfach an verschiedenen Positionen.

Ich könnte mir Vorstellen, das dies zu einem Problem führen kann. Das ist jetzt allerdings nur eine Idee, da ich an anderer Stelle auch keinen Fehler sehen kann.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2015, 16:52
Beitrag #7
RE: Warum wird if nicht ausgeführt??
(03.09.2015 21:59)hotsystems schrieb:  Ich habe mir den Code nochmal angesehen und mir ist aufgefallen, du verwendest die Variable "i" mehrfach an verschiedenen Positionen.

Ich könnte mir Vorstellen, das dies zu einem Problem führen kann. Das ist jetzt allerdings nur eine Idee, da ich an anderer Stelle auch keinen Fehler sehen kann.

Du hast recht ich verwende die variable i an mehreren stellen. Aber die Variablen werden immer in verschiedenen Switch Cases verwendet, von dem her kommen keine verwirrenden werte raus, denke ich.

Un wenn ich per Serial monitor auslese dann ist ja mein gemittelter Analogwert immer unter 20, wo ja dann auch die if Anweisung abfahren sollte.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2015, 10:52
Beitrag #8
RE: Warum wird if nicht ausgeführt??
Hi,
kleine Anmerkung von mir, ich hatte mich auch schon bei der if Abfrage gewundert warum die nicht geht wenn man nur "<" oder ">" schreibt. Aber wenn ich dann "<=" bzw. ">=" verwendet habe lief es zu meiner Verwunderung obwohl in der Doku alle Schreibweisen gültig sein sollen...Huh was dann analog zu dem wäre "=" was richtig auf jeden Fall so ist "==" . Man könnte da gerade meinen das bei dem Vergleichsoperator immer 2 Zeichen stehen müßen.....eigentlich unerklärlich...Sad
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 142 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino Mega 2560 läuft nicht Wolfgang50 6 180 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 334 16.10.2016 14:07
Letzter Beitrag: Pit
  Upload funktioniert nicht Levi 5 240 22.09.2016 20:19
Letzter Beitrag: hotsystems
  ESP8266 tuts nicht sowerum 7 390 19.09.2016 21:01
Letzter Beitrag: sowerum
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 223 16.09.2016 20:36
Letzter Beitrag: Datatom
  SD Karte wird nicht erkannt... Maxi290997 2 202 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 971 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Arduino Uno+Motor Shield+Velleman Mustercode funktionieren nicht Dubidu 8 485 20.07.2016 19:05
Letzter Beitrag: Scheams
  Sketch konnte nicht angelegt werden Sarius 2 238 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


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