정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

정량펌프에 관한 질문2
오정환 | 2016-10-03

안녕하세요. 얼마전 정량펌프에 관한 질문을 드린 사람입니다.

https://www.youtube.com/watch?v=GdTUIwj5ros&list=WL&index=9

(만들고 싶은 정량펌프)

만들고 싶었던 정량 펌프의 소스를 구할수 있게되었습니다.

하지만 하드웨어쪽은 어떻게 준비를 해야 할지 모르겠습니다.

혹시 소스를 보고 어떤 하드웨어들이 필요한지 아실수 있으신가요?

  1. /*==========================================================================   
  2.   Author              : Fahmi Ghani
  3.   Project         : Test Peristaltic pump
  4.   Date                : 20 Sept 2014   
  5.   Video         :https://www.youtube.com/watch?v=GdTUIwj5ros
  6.   Hardware      : Arduino Uno, LCD keypad shield. ULN2003(for switching motor)
  7. ==========================================================================*/
  8. #include <LiquidCrystal.h>
  9. LiquidCrystal lcd(8,9,4,5,6,7);  
  10.  
  11. int keypad_pin = A0;
  12. int Keypad_value = 0;
  13. int Keypad_value_old = 0;
  14.  
  15. char Btn_push;
  16.  
  17. int Pump1 = 2;
  18. int volume = 10;
  19. int volumeOld = 10;
  20. int Pump1State =0;
  21.  
  22. int MenuPage =1;
  23. int MenuPageOld =1;
  24.  
  25. long previousMillis = 0;  
  26. unsigned long currentMillis ;
  27. long interval = 1000;
  28. unsigned long multiplier = 1000; //value to change based on calibration calibration
  29. //multiplier = milliseconds needed to fill 1ml liquid
  30.  
  31. void setup()
  32. {
  33.   lcd.begin(16,2);  //Initialize a 2x16 type LCD
  34.   pinMode(Pump1, OUTPUT);  
  35.   pinMode(10, OUTPUT);  
  36.  
  37.         lcd.setCursor(0,0);
  38.         lcd.print("Peristaltic Pump");
  39.         lcd.setCursor(0,1);
  40.         lcd.print("Test");
  41.         lcd.clear();
  42.         delay(1000);
  43.  
  44.         MenuDisplay(MenuPage);
  45.        
  46.         analogWrite(10,50);
  47.         delay(1000);        
  48. }
  49. void loop()
  50. {
  51.     Btn_push = ReadKeypad();
  52.    
  53.     //Change menu
  54.     if(Btn_push == 'L') MenuPage =1;
  55.     if(Btn_push == 'R') MenuPage =2;
  56.    
  57.     if(MenuPage != MenuPageOld)
  58.     {
  59.         MenuDisplay(MenuPage);
  60.         MenuPageOld = MenuPage;
  61.     }
  62.  
  63.     if(MenuPage ==1)
  64.     {
  65.         if(Btn_push == 'U' && volume <100)
  66.           volume+=1;
  67.  
  68.         if(Btn_push == 'D'&& volume>0)
  69.           volume-=1;
  70.        
  71.         if(volumeOld != volume)//update lcd when got new volume
  72.         {
  73.             lcd.setCursor(8,0);
  74.             lcd.print(volume);
  75.             lcd.print("ml ");
  76.             volumeOld = volume;
  77.         }
  78.        
  79.         if(Btn_push == 'S' )
  80.         {
  81.             RunPump(volume);
  82.            
  83.             MenuDisplay(MenuPage);
  84.            
  85.         }
  86.     }
  87.     if(MenuPage ==2)
  88.     {
  89.        if(Btn_push == 'S')
  90.        {
  91.            if(!Pump1State )
  92.            {
  93.              digitalWrite(Pump1,1);
  94.              lcd.setCursor(0,1);
  95.              lcd.print("Pump Run  ");
  96.              Pump1State =1;
  97.            }
  98.            else
  99.            {      
  100.              digitalWrite(Pump1,0);
  101.              lcd.setCursor(0,1);
  102.              lcd.print("Pump Stop  ");
  103.              Pump1State =0;
  104.            }
  105.            delay(100);
  106.        }
  107.        
  108.     }
  109.  
  110.     delay(200);
  111.  
  112. }//--------------- End of loop() loop ---------------------
  113. void MenuDisplay(int page)
  114. {
  115.     switch (page)
  116.     {
  117.        case 1:
  118.           lcd.clear();
  119.           lcd.setCursor(0,0);
  120.           lcd.print("Volume: ");
  121.           lcd.setCursor(8,0);
  122.           lcd.print(volume);
  123.           lcd.print("ml ");
  124.           break;
  125.        case 2:
  126.           lcd.clear();
  127.           lcd.clear();
  128.           lcd.setCursor(0,0);
  129.           lcd.print("Flush Water");
  130.          break;
  131.     }
  132.  
  133. }
  134.  
  135. void RunPump(unsigned long ml)
  136. {
  137.     previousMillis = millis();
  138.     currentMillis = previousMillis;
  139.    
  140.     interval = ml *multiplier;
  141.    
  142.     digitalWrite(Pump1,1);
  143.    
  144.         lcd.setCursor(4,1);
  145.         lcd.print("ml ");
  146.        
  147.     while(currentMillis - previousMillis < interval)
  148.     {
  149.         currentMillis = millis();
  150.         lcd.setCursor(01);
  151.         lcd.print((currentMillis - previousMillis)/1000);
  152.     }
  153.         lcd.setCursor(01);
  154.         lcd.print((currentMillis - previousMillis)/1000);
  155.    
  156.     digitalWrite(Pump1,0);
  157.     delay(1000);
  158. }
  159.  
  160. char ReadKeypad()
  161. {
  162.   /* Keypad button analog Value
  163.   no button pressed 1023
  164.   select  741
  165.   left    503
  166.   down    326
  167.   up      142
  168.   right   0
  169.   */
  170.   Keypad_value = analogRead(keypad_pin);
  171.  
  172.   if(Keypad_value < 100)
  173.     return 'R';
  174.   else if(Keypad_value < 200)
  175.     return 'U';
  176.   else if(Keypad_value < 400)
  177.     return 'D';
  178.   else if(Keypad_value < 600)
  179.     return 'L';
  180.   else if(Keypad_value < 800)
  181.     return 'S';
  182.   else
  183.     return 0;
  184.  
  185. }
이전글   |    자석으로 버튼을 만들어봐는데 작동이 이상해요 ㅠ... 2016-10-03
다음글   |    데이터 베이스 서버 연결 2016-10-04