From 40d1f31a17e81e2995d572709bef10b4284d1b69 Mon Sep 17 00:00:00 2001 From: Fisch Date: Sat, 26 Jan 2019 23:51:30 +0100 Subject: [PATCH] new fluorescent algorithm --- LEDstoffroehre.ino | 155 ++++++++++++++++++++++------------------- lighttest/lighttest.py | 131 +++++++++++++++++----------------- 2 files changed, 147 insertions(+), 139 deletions(-) diff --git a/LEDstoffroehre.ino b/LEDstoffroehre.ino index d75d945..6d7834d 100644 --- a/LEDstoffroehre.ino +++ b/LEDstoffroehre.ino @@ -3,6 +3,8 @@ //curl -X PUT http://homie.config/config -d @config.json --header "Content-Type: application/json" +// homie/ledstoffroehre/lamp/fluorescent0/set + #define PIN_LAMP0_EDGE D5 #define PIN_LAMP0 D6 #define PIN_LAMP1_EDGE D7 @@ -33,13 +35,29 @@ int setbrightness0 = 0; int setbrightness1 = 0; bool fluorescent0Active=false; bool fluorescent1Active=false; -int fluorescent0Age=10; -int fluorescent1Age=10; -#define FLUORESCENTAGEMAX 20 +int fluorescent0Quality=50; // 0 to 100 +int fluorescent1Quality=50; +#define FLUORESCENQUALITYMAX 100 #define FLUORESCENTTEMPMAX 1000 int fluorescent0Temp=0; int fluorescent1Temp=0; -#define GLOWBRIGHTNESS 5 +#define GLOWBRIGHTNESS 10 + + +int flashprobability0=300; //the higher the lesser +int flashprobabilitymin0=100; //the higher the lesser (at peak) +int tempincreasemax0=10; //the higher the faster lightup + +int flashprobability1=300; //the higher the lesser +int flashprobabilitymin1=100; //the higher the lesser (at peak) +int tempincreasemax1=10; //the higher the faster lightup + +#define FLASHPROBABILITY_MIN 100 +#define FLASHPROBABILITY_MAX 600 +#define FLASHPROBABILITYMIN_MIN 50 +#define FLASHPROBABILITYMIN_MAX 100 //should not be more than FLASHPROBABILITY_MIN +#define TEMPINCREASEMAX_MIN 5 +#define TEMPINCREASEMAX_MAX FLUORESCENTTEMPMAX/10 bool lastSensorValue = false; @@ -59,14 +77,8 @@ bool fluorescentHandler(const HomieRange& range, const String& value) { fluorescent1Temp=0; if (setbrightness0 == 0 || setbrightness1 == 0) { // turned off - fluorescent0Active = false; //set effect off - fluorescent1Active = false; //set effect off - fluorescent0LastActivated = millis(); - fluorescent1LastActivated = millis(); - lamp0e=0; - lamp0=0; - lamp1e=0; - lamp1=0; + resetLamp0(); + resetLamp1(); } else { //turned on //Initialization fluorescent0Active = true; //start effect @@ -82,10 +94,7 @@ bool fluorescent0Handler(const HomieRange& range, const String& value) { fluorescent0Temp=0; if (setbrightness0 == 0) { // turned off - fluorescent0Active = false; //set effect off - fluorescent0LastActivated = millis(); - lamp0e=0; - lamp0 = 0; + resetLamp0(); } else { //turned on //Initialization fluorescent0Active = true; //start effect @@ -100,10 +109,7 @@ bool fluorescent1Handler(const HomieRange& range, const String& value) { fluorescent1Temp=0; if (setbrightness1 == 0) { // turned off - fluorescent1Active = false; //set effect off - fluorescent1LastActivated = millis(); - lamp1e=0; - lamp1 = 0; + resetLamp1(); } else { //turned on //Initialization fluorescent1Active = true; //start effect @@ -112,20 +118,42 @@ bool fluorescent1Handler(const HomieRange& range, const String& value) { return true; } + +void resetLamp0(){ + fluorescent0Active = false; //set effect off + fluorescent0LastActivated = millis(); + lamp0e=0; + lamp0=0; + float speedpercent=fluorescent0Quality*1.0/FLUORESCENQUALITYMAX; + flashprobability0=random(FLASHPROBABILITY_MIN,FLASHPROBABILITY_MAX); + flashprobabilitymin0=random(FLASHPROBABILITYMIN_MIN,FLASHPROBABILITYMIN_MAX); + tempincreasemax0=TEMPINCREASEMAX_MIN+speedpercent*(TEMPINCREASEMAX_MAX-TEMPINCREASEMAX_MIN);//random(TEMPINCREASEMAX_MIN,TEMPINCREASEMAX_MAX); +} +void resetLamp1(){ + fluorescent1Active = false; //set effect off + fluorescent1LastActivated = millis(); + lamp1e=0; + lamp1=0; + float speedpercent=fluorescent1Quality*1.0/FLUORESCENQUALITYMAX; + flashprobability1=random(FLASHPROBABILITY_MIN,FLASHPROBABILITY_MAX); + flashprobabilitymin1=random(FLASHPROBABILITYMIN_MIN,FLASHPROBABILITYMIN_MAX); + tempincreasemax0=TEMPINCREASEMAX_MIN+speedpercent*(TEMPINCREASEMAX_MAX-TEMPINCREASEMAX_MIN); +} + bool fluorescentAgeHandler(const HomieRange& range, const String& value) { Homie.getLogger() << "fluorescentAge " << ": " << value << endl; - fluorescent0Age = constrain(value.toInt(),0,FLUORESCENTAGEMAX); - fluorescent1Age = constrain(value.toInt(),0,FLUORESCENTAGEMAX); + fluorescent0Quality = constrain(value.toInt(),0,FLUORESCENQUALITYMAX); + fluorescent1Quality = constrain(value.toInt(),0,FLUORESCENQUALITYMAX); return true; } -bool fluorescent0AgeHandler(const HomieRange& range, const String& value) { - Homie.getLogger() << "fluorescent0Age " << ": " << value << endl; - fluorescent0Age = constrain(value.toInt(),0,FLUORESCENTAGEMAX); +bool fluorescent0QualityHandler(const HomieRange& range, const String& value) { + Homie.getLogger() << "fluorescent0Quality " << ": " << value << endl; + fluorescent0Quality = constrain(value.toInt(),0,FLUORESCENQUALITYMAX); return true; } -bool fluorescent1AgeHandler(const HomieRange& range, const String& value) { - Homie.getLogger() << "fluorescent1Age " << ": " << value << endl; - fluorescent1Age = constrain(value.toInt(),0,FLUORESCENTAGEMAX); +bool fluorescent1QualityHandler(const HomieRange& range, const String& value) { + Homie.getLogger() << "fluorescent1Quality " << ": " << value << endl; + fluorescent1Quality = constrain(value.toInt(),0,FLUORESCENQUALITYMAX); return true; } @@ -175,7 +203,7 @@ void output() { void loopHandler() { - //mosquitto_pub -h raum.ctdo.de -t "homie/esp-deckenlicht/strip/fluorescent/set" -m "255" + //mosquitto_pub -h raum.ctdo.de -t "homie/ledstoffroehre/lamp/fluorescent0/set" -m "255" if (millis() > fluorescentLastUpdated + FLUORESCENTUPDATEINTERVAL) { //Update values @@ -184,27 +212,20 @@ void loopHandler() if (fluorescent0Active) { //long _time = millis() - fluorescent0LastActivated; //time since activated - int fluorescentTempIncreaseMax=61-(fluorescent0Age*3); - fluorescent0Temp +=1+ random(0,fluorescentTempIncreaseMax *fluorescent0Temp/FLUORESCENTTEMPMAX); - - if (random(0,80 )==0){ //ignite - lamp0=setbrightness0*random(50,100)/100; + fluorescent0Temp+=random(1,tempincreasemax0); + if (random(0,flashprobability0-constrain(fluorescent0Temp*flashprobability0/FLUORESCENTTEMPMAX,0,flashprobability0-flashprobabilitymin0))==0) + { + lamp0=setbrightness0*random(30,100)/10; + lamp0e=lamp0; //flash everything } - - if (fluorescent0Temp>200){ //warm enough to glow - if (lamp0<20){ //if under glow brightness - lamp0+=5; //start glowing - }else if (lamp0>50){ //too bright for glow - lamp0-=random(0,30); //reduce intensity (flashing effect) - } - }else{ //not warm enough to glow - if (lamp0>0){ //too bright for glow - lamp0-=random(20,50); //reduce intensity (flashing effect) - } + lamp0-=40; + if (random(0,100)>95){ + lamp0e+=constrain(random(0,fluorescent0Temp*10/FLUORESCENTTEMPMAX) , 0, 10); //start glowing slowly } - - if(lamp0>GLOWBRIGHTNESS){ - lamp0e=lamp0; + + if (lamp0e>GLOWBRIGHTNESS) + { + lamp0e-=constrain(lamp0e-GLOWBRIGHTNESS,0,20); //make sides darker until glowbrightness } if (fluorescent0Temp>=FLUORESCENTTEMPMAX){ @@ -219,32 +240,24 @@ void loopHandler() output(); } - if (fluorescent1Active) { //long _time = millis() - fluorescent0LastActivated; //time since activated - int fluorescentTempIncreaseMax=61-(fluorescent1Age*3); - fluorescent1Temp +=1+ random(0,fluorescentTempIncreaseMax *fluorescent1Temp/FLUORESCENTTEMPMAX); //+= 1+ random(0,20* fluorescent0Temp/FLUORESCENTTEMPMAX); - - if (random(0,80 )==0){ //ignite - lamp1=setbrightness1*random(50,100)/100; + fluorescent1Temp+=random(1,tempincreasemax1); + if (random(0,flashprobability1-constrain(fluorescent1Temp*flashprobability1/FLUORESCENTTEMPMAX,0,flashprobability1-flashprobabilitymin1))==0) + { + lamp1=setbrightness1*random(30,100)/10; + lamp1e=lamp1; //flash everything } - - if (fluorescent1Temp>200){ //warm enough to glow - if (lamp1<20){ //if under glow brightness - lamp1+=5; //start glowing - }else if (lamp1>50){ //too bright for glow - lamp1-=random(0,30); //reduce intensity (flashing effect) - } - }else{ //not warm enough to glow - if (lamp1>0){ //too bright for glow - lamp1-=random(20,50); //reduce intensity (flashing effect) - } + lamp1-=40; + if (random(0,100)>95){ + lamp1e+=constrain(random(0,fluorescent1Temp*10/FLUORESCENTTEMPMAX) , 0, 10); //start glowing slowly } - - if(lamp1>GLOWBRIGHTNESS){ - lamp1e=lamp1; + + if (lamp1e>GLOWBRIGHTNESS) + { + lamp1e-=constrain(lamp1e-GLOWBRIGHTNESS,0,20); //make sides darker until glowbrightness } if (fluorescent1Temp>=FLUORESCENTTEMPMAX){ @@ -253,12 +266,12 @@ void loopHandler() lamp1e=setbrightness1; } + lamp1=constrain(lamp1, 0,255); lamp1e=constrain(lamp1e, 0,255); output(); } - } @@ -295,9 +308,9 @@ void setup() { lightNode.advertise("fluorescent").settable(fluorescentHandler); lightNode.advertise("fluorescentage").settable(fluorescentAgeHandler); lightNode.advertise("fluorescent0").settable(fluorescent0Handler); - lightNode.advertise("fluorescent0age").settable(fluorescent0AgeHandler); + lightNode.advertise("fluorescent0Quality").settable(fluorescent0QualityHandler); lightNode.advertise("fluorescent1").settable(fluorescent1Handler); - lightNode.advertise("fluorescent1age").settable(fluorescent1AgeHandler); + lightNode.advertise("fluorescent1Quality").settable(fluorescent1QualityHandler); sensorNode.advertise("motion"); diff --git a/lighttest/lighttest.py b/lighttest/lighttest.py index e230c6b..8ce3a83 100644 --- a/lighttest/lighttest.py +++ b/lighttest/lighttest.py @@ -17,15 +17,48 @@ clock = pygame.time.Clock() import time -FLUORESCENTTEMPMAX=400 - -fluorescentCurrentBrightness=0 -fluorescentTemp=0 -fluorescentActive=True +lamp0e=0 +lamp0=0 +lamp1e=0 +lamp1=0 -fluorescentSet=255 +setbrightness0 = 0 +#setbrightness1 = 0; +fluorescent0Active=False +#fluorescent1Active=False; +fluorescent0Age=10 +#fluorescent1Age=10; +FLUORESCENTAGEMAX= 20 +FLUORESCENTTEMPMAX= 1000 +fluorescent0Temp=0 +#fluorescent1Temp=0; +GLOWBRIGHTNESS= 50 +flashprobability0=300 #the higher the lesser +flashprobabilitymin0=100 #the higher the lesser (at peak) +tempincreasemax0=10 #the higher the faster lightup + +FLASHPROBABILITY_MIN=200 +FLASHPROBABILITY_MAX=600 +FLASHPROBABILITYMIN_MIN=100 +FLASHPROBABILITYMIN_MAX=150 +TEMPINCREASEMAX_MIN=5 +TEMPINCREASEMAX_MAX=15 + + +flashprobability0=random.randint(FLASHPROBABILITY_MIN,FLASHPROBABILITY_MAX) +flashprobabilitymin0=random.randint(FLASHPROBABILITYMIN_MIN,FLASHPROBABILITYMIN_MAX) +tempincreasemax0=random.randint(TEMPINCREASEMAX_MIN,TEMPINCREASEMAX_MAX) + + + +fluorescent0Active=True #start +setbrightness0=255 + + +def constrain(val, min_val, max_val): + return min(max_val, max(min_val, val)) # Loop as long as done == False while not done: @@ -35,73 +68,35 @@ while not done: if event.type == pygame.QUIT: # If user clicked close done = True # Flag that we are done so we exit this loop + + + if (fluorescent0Active): + fluorescent0Temp+=random.randint(1,tempincreasemax0) + if (random.randint(0,flashprobability0-constrain(fluorescent0Temp*flashprobability0/FLUORESCENTTEMPMAX,0,flashprobability0-flashprobabilitymin0))==0): + lamp0=setbrightness0*random.randint(30,100)/10 + lamp0e=lamp0 #flash everything + lamp0-=20 + lamp0e+=constrain(random.randint(-10,fluorescent0Temp*10/FLUORESCENTTEMPMAX) , 0, 10) #start glowing slowly + if (lamp0e>GLOWBRIGHTNESS): + lamp0e-=constrain(lamp0e-GLOWBRIGHTNESS,0,20) #make sides darker until glowbrightness + if fluorescent0Temp>=FLUORESCENTTEMPMAX: + fluorescent0Active=False + fluorescent0Temp=0 + lamp0=setbrightness0 + lamp0e=setbrightness0 + print("finished") - ''' - if (fluorescentActive): - fluorescentTemp+=random.randint(0,3 +1) - - if (random.randint(0, 256+1) < fluorescentTemp*1.0/FLUORESCENTTEMPMAX*256): - if (random.randint(0, 40+1) ==0): #ignite - fluorescentCurrentBrightness=fluorescentSet*random.randint(50,100)/100 - - if (random.randint(0, 256+1) > fluorescentTemp*1.0/FLUORESCENTTEMPMAX*256): - if (fluorescentCurrentBrightness<5): - if (random.randint(0,50 +1)==0): #ignite - fluorescentCurrentBrightness=fluorescentSet*random.randint(50,100)/100 - if (fluorescentCurrentBrightness>20): - fluorescentCurrentBrightness-=30 - - if (fluorescentTemp>=FLUORESCENTTEMPMAX): - fluorescentActive=False - fluorescentCurrentBrightness=fluorescentSet + lamp0=constrain(int(lamp0),0,255) + lamp0e=constrain(int(lamp0e),0,255) + clamp0 = (lamp0,lamp0,lamp0) + clamp0e = (lamp0e,lamp0e,lamp0e) - if (fluorescentCurrentBrightness>255): - fluorescentCurrentBrightness=255 - if (fluorescentCurrentBrightness<0): - fluorescentCurrentBrightness=0 - - COLOR = (fluorescentCurrentBrightness,fluorescentCurrentBrightness,fluorescentCurrentBrightness) - else: - COLOR = (fluorescentSet,fluorescentSet,fluorescentSet) - ''' - - - if (fluorescentActive): - fluorescentTemp+=1+ random.randint(0,20* fluorescentTemp/FLUORESCENTTEMPMAX) - #fluorescentTemp+=3 - - - if (random.randint(0,80 +1)==0): #ignite - fluorescentCurrentBrightness=fluorescentSet*random.randint(50,100)/100 - - if (fluorescentTemp>200): #warm enough to glow - if (fluorescentCurrentBrightness<20): #if under glow brightness - fluorescentCurrentBrightness+=5 #start glowing - elif (fluorescentCurrentBrightness>50): #too bright for glow - fluorescentCurrentBrightness-=random.randint(0,30) #reduce intencity (flashing effect) - else: #not warm enough to glow - if (fluorescentCurrentBrightness>0): #too bright for glow - fluorescentCurrentBrightness-=random.randint(20,50) #reduce intencity (flashing effect) - - if (fluorescentTemp>=FLUORESCENTTEMPMAX): - fluorescentActive=False - fluorescentCurrentBrightness=fluorescentSet - print("Finished") - - if (fluorescentCurrentBrightness>255): - fluorescentCurrentBrightness=255 - if (fluorescentCurrentBrightness<0): - fluorescentCurrentBrightness=0 - - COLOR = (fluorescentCurrentBrightness,fluorescentCurrentBrightness,fluorescentCurrentBrightness) - else: - COLOR = (fluorescentSet,fluorescentSet,fluorescentSet) - - - screen.fill(COLOR) + screen.fill(clamp0) #center + pygame.draw.rect(screen,clamp0e,(0,0,20,size[1])) #left edge + pygame.draw.rect(screen,clamp0e,(size[0]-20,0,20,size[1]))#right edge pygame.display.flip()