skizziks_53

Reddit solenoid drum driver thing v1.0

Oct 19th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. /*
  2.   Reddit slenoid driver - 19 October 2019
  3.  
  4.   This sketch is for driving solenoids at different random rates.
  5.   The strike times should vary, but the strike durations should always remain short.
  6.  
  7.   Board -- appears to be an Uno?
  8.  
  9.   There are serial messages that show the countdown timer and the function to change solenoid intervals.
  10.  
  11. */
  12.  
  13. const int solenoid_pin[] =  { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
  14.  
  15. int solenoid_state[10]; // Initialize to zero values in setup()
  16.  
  17. int interval_times[6]; // This is for generating the new interval times in for the five groups. (index zero not used)
  18.  
  19. int solenoid_interval_time[10]; // This is the time in milliseconds for each solenoid to wait before striking.
  20.  
  21. int solenoid_interval_target_time[10]; // This is the current time that the solenoid is waiting for (can be solenoid_interval_time[] or solenoid_strike_time)
  22.  
  23. int solenoid_strike_time = 50; // This is the time in milliseconds for all the solenoids to remain HIGH before turning off.
  24.  
  25. // All of the solenoids need their own time tracking:
  26. unsigned long solenoid_current_time = 0;
  27. unsigned long solenoid_previous_time[10]; // Initiaize to zero values during setup()
  28.  
  29. // The function to generate new times is called every X seconds:
  30. int change_solenoid_times__time_interval_in_seconds = 20;
  31. int change_solenoid_times__time_interval_counter = change_solenoid_times__time_interval_in_seconds;
  32. unsigned long one_second_timer_begin_time = 0;
  33. unsigned long one_second_timer_current_time = 0;
  34.  
  35.  
  36.  
  37. void setup() {
  38.   Serial.begin(9600);
  39.  
  40.   for (int x = 0; x < 10; x++) {
  41.     solenoid_state[x] = 0;
  42.     solenoid_previous_time[x] = 0;
  43.     // set the digital pin(s) as output(s):
  44.     pinMode(solenoid_pin[x], OUTPUT);
  45.     // write all the solenoid pins low to start:
  46.     digitalWrite(solenoid_pin[x], solenoid_state[x]);
  47.   }
  48.  
  49.   pinMode(13, OUTPUT); // Some clone boards put pin 13 high unless you tell them to turn it off.
  50.   digitalWrite(13, LOW); // Some clone boards put pin 13 high unless you tell them to turn it off.
  51.  
  52.   generate_new_solenoid_strike_times();
  53.   strike_all_solenoids_now();
  54.  
  55.   Serial.println("Exiting setup()");
  56. }
  57.  
  58.  
  59.  
  60. void loop() {
  61.  
  62.   check_if_solenoids_need_to_change_state(); // This operates the solenoids, if needed.
  63.  
  64.   check_the_one_second_timer(); // This generates new random times for the solenoids, if needed.
  65.  
  66. }
  67.  
  68.  
  69.  
  70. void check_if_solenoids_need_to_change_state() {
  71.   solenoid_current_time = millis();
  72.   for (int x = 0; x < 10; x++) {
  73.     if (solenoid_current_time >= solenoid_previous_time[x]) {
  74.       if (solenoid_current_time >= (solenoid_previous_time[x] + solenoid_interval_target_time[x])) {
  75.         if (solenoid_state[x] == 0) {
  76.           // switch to the long delay:
  77.           solenoid_interval_target_time[x] = solenoid_strike_time;
  78.           solenoid_state[x] = 1;
  79.         }
  80.         else { // solenoid_state[x] == 1
  81.           // switch to the short delay:
  82.           solenoid_interval_target_time[x] = solenoid_interval_time[x];
  83.           solenoid_state[x] = 0;
  84.         }
  85.         digitalWrite(solenoid_pin[x], solenoid_state[x]);
  86.         solenoid_previous_time[x] = millis();
  87.       }
  88.     }
  89.     else {
  90.       solenoid_previous_time[x] = millis();
  91.     }
  92.   }
  93. }
  94.  
  95.  
  96. void check_the_one_second_timer() {
  97.   // The function to generate new times is called every X seconds:
  98.   one_second_timer_current_time = millis();
  99.   if (one_second_timer_current_time >= one_second_timer_begin_time) {
  100.     if (one_second_timer_current_time >= (one_second_timer_begin_time + 1000)) {
  101.       change_solenoid_times__time_interval_counter--;
  102.       if (change_solenoid_times__time_interval_counter == 0) {
  103.         set_all_solenoids_low();
  104.         generate_new_solenoid_strike_times();
  105.         change_solenoid_times__time_interval_counter = change_solenoid_times__time_interval_in_seconds;
  106.       }
  107.       else {
  108.         Serial.print("Countdown = ");
  109.         Serial.println(change_solenoid_times__time_interval_counter);
  110.       }
  111.       one_second_timer_begin_time = millis();
  112.     }
  113.   }
  114.   else {
  115.     one_second_timer_begin_time = millis();
  116.   }
  117. }
  118.  
  119.  
  120. void generate_new_solenoid_strike_times() {
  121.   Serial.println("Generating new solenoid intervals");
  122.   interval_times[1] = random(50, 3000);
  123.   interval_times[2] = random(50, 1000);
  124.   interval_times[3] = random(50, 10000);
  125.   interval_times[4] = random(50, 2000);
  126.   interval_times[5] = random(50, 500);
  127.  
  128.   solenoid_interval_time[1] = interval_times[1]; // Solenoid #1 is using interval #1.
  129.   solenoid_interval_time[2] = interval_times[2]; // Solenoid #2 is using interval #2.
  130.   solenoid_interval_time[3] = interval_times[3]; // Solenoid #3 is using interval #3.
  131.  
  132.   solenoid_interval_time[4] = interval_times[4]; // Solenoid #4 is using interval #4.
  133.   solenoid_interval_time[5] = interval_times[4]; // Solenoid #5 is using interval #4.
  134.   solenoid_interval_time[6] = interval_times[4]; // Solenoid #6 is using interval #4.
  135.   solenoid_interval_time[7] = interval_times[4]; // Solenoid #7 is using interval #4.
  136.  
  137.   solenoid_interval_time[8] = interval_times[5]; // Solenoid #8 is using interval #5.
  138.   solenoid_interval_time[9] = interval_times[5]; // Solenoid #9 is using interval #5.
  139.   solenoid_interval_time[10] = interval_times[5]; // Solenoid #10 is using interval #5.
  140.  
  141. }
  142.  
  143.  
  144. void strike_all_solenoids_now() {
  145.   for (int x = 0; x < 10; x++) {
  146.     solenoid_state[x] = 1;
  147.     solenoid_previous_time[x] = millis();
  148.     digitalWrite(solenoid_pin[x], solenoid_state[x]);
  149.   }
  150. }
  151.  
  152. void set_all_solenoids_low() {
  153.   for (int x = 0; x < 10; x++) {
  154.     solenoid_state[x] = 0;
  155.     digitalWrite(solenoid_pin[x], solenoid_state[x]);
  156.   }
  157. }
  158.  
  159.  
  160.  
  161. // ~~~~~~~~ the end ~~~~~~~~
Add Comment
Please, Sign In to add comment