Помогите добавить функцию пожалуйста
- Войдите на сайт для отправки комментариев
Пт, 02/10/2015 - 17:32
Здравствуйте! Я в программировании полный профан и прошу помощи, собственно вот скетч(это управление перистальтическим насосом):
[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 остановка подачи, при размыкании всех возабновление подачи. Вот. И нужна типа менюшки что ли чтобы можно было выбрать непрерывная работа(как в скетче) или с отключением по датчику.
Если кому не сложно допишите пожалуйста... сам реально не соображаю в этом. За ранее Благодарю с Уважением Максим!
Максим, здесь у Вас очень немного шансов, что кто-то Вам что-то допишет. Обратитесь в ветку http://arduino.ru/forumy/ishchu-ispolnitelya там за разумную денюжку обязательно найдётся, кто сделает.