Помогите добавить функцию пожалуйста

ksimma
Offline
Зарегистрирован: 02.10.2015

Здравствуйте! Я в программировании полный профан и прошу помощи, собственно вот скетч(это управление перистальтическим насосом):

[code]
#include <LiquidCrystal.h>
#define tic 0x927C0
 
#define EN_PIN   4 // Пин включения драйвера
#define STEP_PIN  3 // Пин сигнала шага драйвера (CLC, STEP)
#define DIR_PIN  2 //Пин направления вращения (CW, DIR
 
#define RS_PIN 5 // Пин сигнала RES дисплея
#define RW_PIN 6 // Пин сигнала RW дисплея
#define E_PIN 12 // Пин сигнала En дисплея
 
#define D4_PIN 10 // Пин полубайта данных дисплея
#define D5_PIN 11 // Пин полубайта данных дисплея
#define D6_PIN 8 // Пин полубайта данных дисплея
#define D7_PIN 9 // Пин полубайта данных дисплея
 
#define KEY_1 17 // Пин кнопки 1
#define KEY_2 16 // Пин кнопки 2
#define KEY_3 19 // Пин кнопки 3
#define KEY_4 18 // Пин кнопки 4
#define LCD_ROW 2 // Строк дисплея
#define LCD_COL 16 // Символов в строке
 
LiquidCrystal lcd(RS_PIN, RW_PIN, E_PIN, D4_PIN, D5_PIN, D6_PIN, D7_PIN); //Конфигурируем дисплей
 
volatile uint16_t count; 
volatile unsigned long speed;
volatile bool run;
bool start, dir, timer_run, key[4], key_action[4], refresh_speed, refresh_dir, refresh_run, refresh_disp, info, refresh_info;
int min_rpm, max_rpm;
uint8_t mode;
unsigned char current_screen;
 
char info_1[LCD_COL]={'P','e','r','i','s','t','a','l','t','i','c',' ','p','u','m','p'};
char info_2[LCD_COL]={' ',' ','V','e','r','s','i','o','n',' ','0','.','9','0',' ',' '};
 
byte s1[8] = {0b00100,0b00100,0b00100,0b00100,0b00100,0b11111,0b01110,0b00100};
byte s2[8] = {0b00100,0b01110,0b11111,0b00100,0b00100,0b00100,0b00100,0b00100};
 
char rpm_str[5];
 
float rpm;
unsigned long key_time[5];
 
void setup()
{
    lcd.createChar(0, s1);
    lcd.createChar(1, s2);
    
    lcd.begin(LCD_COL, LCD_ROW);
 
    pinMode(STEP_PIN , OUTPUT);
    pinMode(DIR_PIN , OUTPUT);
    pinMode(EN_PIN , OUTPUT);
    
    digitalWrite(DIR_PIN , HIGH);
    
    max_rpm=400;
    min_rpm=0.1;
    rpm=10;
    dir=false;
    speed=tic/rpm;
    run=false;
    start=false;
    info=true;  
    refresh_speed=true;
    refresh_dir=true;
    refresh_run=true;
    refresh_info=true;          
 
    pinMode(KEY_1, INPUT);
    pinMode(KEY_2, INPUT);
    pinMode(KEY_3, INPUT);
    pinMode(KEY_4, INPUT);
    
    TCCR2A = (1<<WGM21);    
    TCCR2B = (1<<CS20);    
    OCR2A = 0x80; 
    TIMSK2 = (1<<OCIE2A);  
  
    sei (); 
}
 
void key_read()
{
   key[0]=digitalRead(KEY_1);
   key[1]=digitalRead(KEY_2);
   key[2]=digitalRead(KEY_3);
   key[3]=digitalRead(KEY_4);     
}
 
void key_check()
{
 char i;
 for (i=0;i<2;i++)
  {    
   if(key[i]) 
    {         
     if (millis()-key_time[i] >100)   
     {
      key_time[i] = millis();    
      key_action[i]=true;
     }
    }
  }
 for (i=2;i<4;i++)
  {    
   if(key[i]) 
    {         
     if (millis()-key_time[i] >400)   
     {
      key_time[i] = millis();    
      key_action[i]=true;
     }
    }
  }
}
 
void action()
{
  if ((key_action[0])&&(rpm>0.1))
   {
     key_action[0]=false;
     if (rpm>=30) rpm--;
      else rpm=rpm-0.1;   
     refresh_speed=true;   
    }
  if ((key_action[1])&&(rpm<400))
    {
      key_action[1]=false;
     if (rpm>=30) rpm++;      
      else rpm=rpm+0.1;
     refresh_speed=true;
    }
    if (key_action[2])
    {
      key_action[2]=false;
      change_dir();
      refresh_dir=true;
    }
  
  if (key_action[3])
    {
      key_action[3]=false;
      if (info) 
       {
         info=false;
         refresh_disp=true;
       }
       else
      if (!run) 
        {
          start=true;
          refresh_run=true;
        }
       else run=false;
       refresh_run=true;
    }
}
 
void accelerate()
{
  run=true;
  set_pins();
  int i;
  for(i=1;i<rpm;i++)
    {
       speed = tic/(i);
       delay(3);  
    }
  start=false;
}
 
void decelerate()
{
  int i;
  for(i=rpm;i>10;i--)
    {
       speed = tic/i;
       delay(1);  
    }
   run=false;
}
 
 
void disp()
{
  
  if(info) 
   {
   if(refresh_info)
    {   
     lcd.setCursor(0, 0);
     lcd.print(info_1);
     lcd.setCursor(0, 1);
     lcd.print(info_2);
     refresh_info=false;
    }
   }
   else
    {
     if (refresh_disp)
      {
       lcd.clear();
       lcd.setCursor(1, 1);
       lcd.write(byte(0)); 
       lcd.setCursor(5, 1);
       lcd.write(byte(1)); 
       lcd.setCursor(8, 1);
       lcd.print("<=>"); 
       lcd.setCursor(0, 0);
       lcd.print("Sp: "); 
       
       refresh_disp=false;
      } 
      
     if(refresh_speed)
      {  
       lcd.setCursor(3, 0);   
       dtostrf(rpm,3,1,rpm_str);  
       lcd.print(rpm_str);
       lcd.print(" RPM  ");     
       refresh_speed=false;       
      }
     
     if(refresh_dir)
      {
       lcd.setCursor(14, 0);
       if (dir) lcd.print("<=");
          else lcd.print("=>");   
       refresh_dir=false;
      }
     if (refresh_run)
      if (!run)    
       {
        lcd.setCursor(13, 1);
        lcd.print("RUN"); 
       }
      else
      {
       lcd.setCursor(13, 1);
       lcd.print("STP"); 
      }
    }
}
 
void change_dir()
{
  if (run) 
   {
     decelerate();
     dir=!dir;
     start=true;
   }
  else dir=!dir;
}
 
void set_pins()
{
 if(run) digitalWrite(EN_PIN , LOW);
  else  digitalWrite(EN_PIN , HIGH);
 if(dir) digitalWrite(DIR_PIN , LOW);
  else  digitalWrite(DIR_PIN , HIGH);
}
 
void calculate()
{
  speed=tic/rpm;
}
 
void loop()
{
     disp();
     if (start) accelerate();
     key_read();
     key_check();
     action();
     calculate();     
     set_pins();
}
 
ISR (TIMER2_COMPA_vect)
{   
   if (count>0) 
    {
     count--;
     OCR2A = 0x80;
    }
   else 
    {
     digitalWrite(STEP_PIN , HIGH);
     count = speed >> 7;
     OCR2A = speed % 0x80;     
     digitalWrite(STEP_PIN , LOW);
    }            
}
 
 
[/code]
 
нужно что бы подача(шаговик) включался и выключался по показаниям 3х электродного датчика уровня воды
тоесть при замыкании 1-2-3 остановка подачи, при размыкании всех возабновление подачи. Вот. И нужна типа менюшки что ли чтобы можно было выбрать непрерывная работа(как в скетче) или с отключением по датчику.
Если кому не сложно допишите пожалуйста... сам реально не соображаю в этом. За ранее Благодарю с Уважением Максим!
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Максим, здесь у Вас очень немного шансов, что кто-то Вам что-то допишет. Обратитесь в ветку http://arduino.ru/forumy/ishchu-ispolnitelya там за разумную денюжку обязательно найдётся, кто сделает.