Guest User

Untitled

a guest
Jan 11th, 2016
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.23 KB | None | 0 0
  1. /******************************************************************************
  2.  * Enum afkortingen Wissel
  3.  ******************************************************************************/
  4. enum wisselStates_t { Recht = 0, Afbuigen};
  5. enum blokStates_t   { Vrij = 0, Bezet};
  6.  
  7.  
  8. /******************************************************************************
  9.  * Debug modes
  10.  ******************************************************************************/
  11. //Serial monitor compenstatie, -'1'
  12. #define DEBUG_SERIAL_MONITOR
  13. //Algemene debug info
  14. #define DEBUG_SKETCH
  15.  
  16. /******************************************************************************
  17.  * Wissel parameters
  18.  ******************************************************************************/
  19. const byte WisselPins[][2] = {{13, 14}, {11, 12}}; //wissel pinnen
  20. const unsigned int WisselSchakeltijd = 200; //Schakeltijd van de wissels in ms
  21. const byte WisselBufferSize = 8;  //Grote van de wissel buffer
  22.  
  23. /******************************************************************************
  24.  * Serial parameters
  25.  ******************************************************************************/
  26. const unsigned int SerialInterval = 200;  //Tijd waarbinnen een commando binnen moet zijn in ms
  27.  
  28. /******************************************************************************
  29.  * Wissel variabele
  30.  ******************************************************************************/
  31. byte wisselBuffer[WisselBufferSize];      //Buffer voor wissel adressen
  32. bool wisselStateBuffer[WisselBufferSize]; //buffer voor wissel stateas
  33. byte volgendeWisselInvoer = 0;  //Waar de volgende wissel invoegen
  34. byte volgendeWisselUitvoer = 0; //Waar de volgende wissel schakelen
  35.  
  36. void setup(){
  37.   for(byte i = 0; i < sizeof(WisselPins); i++){
  38.     pinMode(WisselPins[i][Recht], OUTPUT);
  39.     pinMode(WisselPins[i][Afbuigen], OUTPUT);
  40.   }
  41.  
  42.   Serial.begin(115200); //tijd voor 115200?
  43. }
  44.  
  45. void loop() {
  46.   checkIngekomenSerial();
  47.   updateWissels();
  48.  
  49. }
  50.  
  51.  
  52. //Inkomende seriele data controleren
  53. void checkIngekomenSerial() {
  54.   // Ga dan uit dat de serial commando's eruit zien als
  55.   // [commando letter] [adres]
  56.   // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)
  57.  
  58.   static unsigned int lastCommandMillis = 0;
  59.   unsigned int nowMillis = millis();
  60.    
  61.   if (Serial.available() >= 2) {
  62.     lastCommandMillis = nowMillis;
  63.    
  64.     switch (Serial.read()) {
  65.  
  66.       //schakel een wissel recht
  67.       case 'W':
  68.         setWissel(Serial.read(), Recht);
  69.        
  70.         break;
  71.  
  72.       //schakel een wissel afbuigend
  73.       case 'w':
  74.         setWissel(Serial.read(), Afbuigen);
  75.        
  76.         break;
  77.  
  78.       //Maak blok vrij
  79.       case 'b':
  80.         setBlok(Serial.read(), Vrij);
  81.  
  82.         break;
  83.  
  84.       case 'B':
  85.         setBlok(Serial.read(), Bezet);
  86.  
  87.         break;
  88.     }
  89.   }
  90.  
  91.   //Is het anders tijd voor het legen van de buffer?
  92.   //Gebeurd als er SerialInterval lang geen geldig commando is ontvangen
  93.   else if(Serial.available() && (nowMillis - lastCommandMillis >= SerialInterval)){
  94.     while(Serial.available()){
  95.       Serial.read();
  96.     }
  97.   }
  98.  
  99.   //Om te zorgen dat de buffer niet geleegd word als we na een lange tijd weer beginnen met het zenden van een commando
  100.   //updaten we de tijd ook als de buffer gewoon leeg is. Kan ook gezien worden als geldig
  101.   //commando voor do niets ;)
  102.   else if(!Serial.available()){
  103.     lastCommandMillis = millis();
  104.   }
  105. }
  106.  
  107.  
  108. //wissel schakelen
  109. void setWissel(byte adres, bool state){
  110.  
  111.   #if defined(DEBUG_SERIAL_MONITOR)
  112.     //Even compenseren voor ASCII. Werkt alleen voor 1 t/m 9.
  113.     //GEEN oplossing dus. Beter en simpeler om een echte byte te sturen maar dat doet de serial monitor niet
  114.     adres -= '1';
  115.   #endif
  116.  
  117.   #if defined(DEBUG_SKETCH)
  118.     Serial.print(F("Wissel "));
  119.     Serial.print(adres);
  120.     Serial.print((state ? "/": "|"));
  121.   #endif
  122.  
  123.   //Als er ruimte is en adres is geldig dan toevoegen aan buffer
  124.   if(wisselBufferRuimte && adres < sizeof(WisselPins) / sizeof(WisselPins[0])){
  125.     #if defined(DEBUG_SKETCH)
  126.       Serial.print(F(" Slot "));
  127.       Serial.print(volgendeWisselInvoer);
  128.     #endif
  129.    
  130.     //toevoegen aan buffer
  131.     wisselBuffer[volgendeWisselInvoer] = adres;
  132.     wisselStateBuffer[volgendeWisselInvoer] = state;
  133.    
  134.     //Invoer pointer naar volgende slot
  135.     volgendeWisselInvoer++;
  136.     volgendeWisselInvoer %= WisselBufferSize;
  137.   }
  138.   else{
  139.     Serial.print(F("Wissel buffer vol!"));
  140.   }
  141.   Serial.println();
  142. }
  143.  
  144. //wissels updaten, oproepen in loop()
  145. void updateWissels(){
  146.   static unsigned int lastMillis = 0;
  147.   static bool wisselActief = false;
  148.   unsigned int nowMillis = millis();
  149.  
  150.   //als er een wissel actief is
  151.   if(wisselActief){
  152.     //wacht deze af
  153.     if(nowMillis - lastMillis >= WisselSchakeltijd){
  154.       //uitgang deactiveren
  155.       digitalWrite(WisselPins[wisselBuffer[volgendeWisselUitvoer]][wisselStateBuffer[volgendeWisselUitvoer]], LOW);
  156.       //opslaan dat er geen wissel actief is
  157.       wisselActief = false;
  158.      
  159.       //naar volgende buffer plek
  160.       volgendeWisselUitvoer++;
  161.       volgendeWisselUitvoer %= WisselBufferSize;
  162.     }
  163.   }
  164.  
  165.   //Als er nu geen wissel actief is kunnen we de volgende schakelen
  166.   else{
  167.     //zolang de uitvoer nog niet bij is met de invoer is er dus een wissel te schakelen
  168.     if(volgendeWisselInvoer != volgendeWisselUitvoer){
  169.       #if defined(DEBUG_SKETCH)
  170.         Serial.print(F("schakelen! "));
  171.         Serial.print(wisselBuffer[volgendeWisselUitvoer]);
  172.         Serial.println((wisselStateBuffer[volgendeWisselUitvoer] ? "/": "|"));
  173.       #endif
  174.        
  175.       //uitgang schakelen
  176.       digitalWrite(WisselPins[wisselBuffer[volgendeWisselUitvoer]][wisselStateBuffer[volgendeWisselUitvoer]], HIGH);
  177.       //opslaan dat er een wissel actief is
  178.       wisselActief = true;
  179.       //begintijd opslaan
  180.       lastMillis = nowMillis;
  181.     }
  182.   }
  183. }
  184.  
  185. //als volgende invoer 1 kleiner is dan volgende uitvoer is de buffer vol
  186. inline bool wisselBufferRuimte(){
  187.     return ( ((volgendeWisselInvoer + 1) % WisselBufferSize) != volgendeWisselUitvoer);
  188. }
  189.  
  190. void setBlok(byte address, bool state) {
  191.  
  192.   Serial.print("Blok ");
  193.   Serial.print(address);
  194.   if (state) {
  195.     Serial.println(" bezet");
  196.   }
  197.   else {
  198.     Serial.println(" vrij");
  199.   }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment