-
Posts: 86 Joined: Sat Jan 04, 2014 10:26 am
|
 Posted: Wed Mar 12, 2014 6:36 am

- IMAG0802.jpg (71.13 KiB) Viewed 3825 times
I think I broke something my storm is after the clouds is that right? - Code: Select all
//********************************************************************************************************************************* // Random Cloud/Thunderstorm effects function void CheckCloud() {
// ------------------------------------------------------------ // Change the values below to customize your cloud/storm effect
// Frequency in days based on the day of the month - number 2 means every 2 days, for example (day 2,4,6 etc) // For testing purposes, you can use 1 and cause the cloud to occur everyday #define Clouds_Every_X_Days 1
// Percentage chance of a cloud happening today // For testing purposes, you can use 100 and cause the cloud to have 100% chance of happening #define Cloud_Chance_per_Day 100
// Minimum number of minutes for cloud duration. Don't use max duration of less than 6 #define Min_Cloud_Duration 7
// Maximum number of minutes for the cloud duration. Don't use max duration of more than 255 #define Max_Cloud_Duration 15
// Minimum number of clouds that can happen per day #define Min_Clouds_per_Day 3
// Maximum number of clouds that can happen per day #define Max_Clouds_per_Day 5
// Only start the cloud effect after this setting // In this example, start could after 11:30am #define Start_Cloud_After NumMins(15,00)
// Always end the cloud effect before this setting // In this example, end could before 8:00pm #define End_Cloud_Before NumMins(22,00)
// Percentage chance of a lightning happen for every cloud // For testing purposes, you can use 100 and cause the lightning to have 100% chance of happening #define Lightning_Change_per_Cloud 100
// Note: Make sure to choose correct values that will work within your PWMSLope settings. // For example, in our case, we could have a max of 5 clouds per day and they could last for 50 minutes. // Which could mean 250 minutes of clouds. We need to make sure the PWMSlope can accomodate 250 minutes of effects or unforseen resul could happen. // Also, make sure that you can fit double those minutes between Start_Cloud_After and End_Cloud_Before. // In our example, we have 510 minutes between Start_Cloud_After and End_Cloud_Before, so double the 250 minutes (or 500 minutes) can fit in that 510 minutes window. // It's a tight fit, but it did.
//#define printdebug // Uncomment this for debug print on Serial Monitor window #define forcecloudcalculation // Uncomment this to force the cloud calculation to happen in the boot process.
// Change the values above to customize your cloud/storm effect // ------------------------------------------------------------ // Do not change anything below here
static byte cloudchance=255; static byte cloudduration=0; static int cloudstart=0; static byte numclouds=0; static byte lightningchance=0; static byte cloudindex=0; static byte lightningstatus=0; static int LastNumMins=0; // Every day at midnight, we check for chance of cloud happening today if (hour()==0 && minute()==0 && second()==0) cloudchance=255;
#ifdef forcecloudcalculation if (cloudchance==255) #else if (hour()==0 && minute()==0 && second()==1 && cloudchance==255) #endif { //Pick a random number between 0 and 99 cloudchance=random(100); // if picked number is greater than Cloud_Chance_per_Day, we will not have clouds today if (cloudchance>Cloud_Chance_per_Day) cloudchance=0; // Check if today is day for clouds. if ((day()%Clouds_Every_X_Days)!=0) cloudchance=0; // If we have cloud today if (cloudchance) { // pick a random number for number of clouds between Min_Clouds_per_Day and Max_Clouds_per_Day numclouds=random(Min_Clouds_per_Day,Max_Clouds_per_Day); // pick the time that the first cloud will start // the range is calculated between Start_Cloud_After and the even distribuition of clouds on this day. cloudstart=random(Start_Cloud_After,Start_Cloud_After+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))); // pick a random number for the cloud duration of first cloud. cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration); //Pick a random number between 0 and 99 lightningchance=random(100); // if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0; } } // Now that we have all the parameters for the cloud, let's create the effect
if (cloudchance) { //is it time for cloud yet? if (NumMins(hour(),minute())>=cloudstart && NumMins(hour(),minute())<(cloudstart+cloudduration)) { DaylightPWMValue=ReversePWMSlope(cloudstart,cloudstart+cloudduration,DaylightPWMValue,15,180); if (lightningchance && (NumMins(hour(),minute())==(cloudstart+(cloudduration/2))) && second()<5) { if (random(100)<20) lightningstatus=1; else lightningstatus=0; if (lightningstatus) { DaylightPWMValue=100; ActinicPWMValue=100; } else { DaylightPWMValue=0; ActinicPWMValue=15; } delay(1); } } if (NumMins(hour(),minute())>(cloudstart+cloudduration)) { cloudindex++; if (cloudindex < numclouds) { cloudstart=random(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2),(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2))+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))); // pick a random number for the cloud duration of first cloud. cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration); //Pick a random number between 0 and 99 lightningchance=random(100); // if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0; } } } if (LastNumMins!=NumMins(hour(),minute())) { LastNumMins=NumMins(hour(),minute()); ReefAngel.LCD.Clear(255,0,120,132,132); ReefAngel.LCD.DrawText(0,255,8,108,"Cloud"); ReefAngel.LCD.DrawText(0,255,8,118,"00:00"); ReefAngel.LCD.DrawText(0,255,90,108,"Storm"); ReefAngel.LCD.DrawText(0,255,48,108,"Length"); ReefAngel.LCD.DrawText(0,255,90,118,"00:00"); if (cloudchance && (NumMins(hour(),minute())<cloudstart)) { int x=0; if ((cloudstart/60)>=10) x=8; else x=14; ReefAngel.LCD.DrawText(37,255,x,118,(cloudstart/60)); if ((cloudstart%60)>=10) x=58; else x=64; ReefAngel.LCD.DrawText(37,255,x,118,(cloudstart%60)); } if (lightningchance) { int x=0; if (((cloudstart+(cloudduration/2))/60)>=10) x=90; else x=96; ReefAngel.LCD.DrawText(37,255,x,118,((cloudstart+(cloudduration/2))/60)); if (((cloudstart+(cloudduration/2))%60)>=10) x=108; else x=114; ReefAngel.LCD.DrawText(37,255,x,118,((cloudstart+(cloudduration/2))%60)); } } }
byte ReversePWMSlope(long cstart,long cend,byte PWMStart,byte PWMEnd, byte clength) { long n=elapsedSecsToday(now()); cstart*=60; cend*=60; if (n<cstart) return PWMStart; if (n>=cstart && n<=(cstart+clength)) return map(n,cstart,cstart+clength,PWMStart,PWMEnd); if (n>(cstart+clength) && n<(cend-clength)) return PWMEnd; if (n>=(cend-clength) && n<=cend) return map(n,cend-clength,cend,PWMEnd,PWMStart); if (n>cend) return PWMStart; }

|