Witajcie. Mam pewien sketch, który wykorzystuje 6 przycisków na mikrosłiczach z rezystorem podciągającym. W szpargałkach znalazłem klawirkę membranową 3x4 i chciałbym ją wykorzystać w tym projekcie, ale jestem początkujący in ie wiem jak mam ją uwzględnić w programie. Klawirka działa, bo testowałem ją na przykładowy sketchu. Prosze o podpowiedzi, dziękuje.
Kod:
*
*/
// REQUIRES THE FOLLOWING LIBRARIES:
// Liquidcrystal_i2c: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library/archive/master.zip
#include <Wire.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal lcd(39, 41, 43, 45, 47, 32);
#define button_left A4 // Carrier Left Move Button. Pin 11 on Atmega328
#define button_right A6 // Carrier Right Move Button. Pin 12 on Atmega328
#define button_sync A2 // MANU/SYNC toggle. Pin 17 on Atmega328
#define button_spoolA A3 // Spool turn button. Pin 23 on Atmega328
#define button_spoolB A5 // Sppol turn button. Pin 24 on ATmega328
#define button_enable A1 // Button to enable motors. Pin 25 on ATmega328
//#define pos1_int 19 // endswitch interrupt. Pin 4 on Atmega328
//#define pos2_int 20 // endswitch interrupt. Pin 5 on Atmega328
#define pos1_di A9 // endswitch sensor. Pin 4 on Atmega328
#define pos2_di A10 // endswitch sensor. Pin 5 on Atmega328
#define Pot A11 // Potentiometer Pin - Speed Control. Pin 26 on Atmega328
#define mot1 2 // Motor 1 - The coil spool. Pin 15 on Atmega328
#define mot2 3 // Motor 2 - The carrier. Pin 16 on Atmega328
#define dir1 4 // Direction pin for motor 1. Pin 13 on Atmega328
#define dir2 5 // Direction pin for motor 2. Pin 14 on Atmega328
#define enable_control 6 // Output to enable the motors. Pin 18 on ATmega328
#define ledlight 13 // Led output. Pin 19 on ATmega328
const float leadscrewpitch = 1.25; // Pitch of the leadscrew in mm
const float reducerratio = 16/1; //5 + 2/11;
const int step_per_rev = 200;
const int step_per_full_rev = step_per_rev * reducerratio;
float wiresize; //size of the wire in mm.
float speed_ratio; // Speed ratio between the two motor.
float step_delay1, step_delay2; // delay between two steps of the stepper motor.
int val;
int stepcount = 0;
int turncount = 0;
unsigned long timestamp_1 = 0;
unsigned long timestamp_2 = 0;
unsigned long timestamp_3 = 0;
long dtime = 0;
boolean sync = false; // Toggle between manual and synchronised mode
boolean run_spool = false; // For manual mode only. Toggle for allowing spool to run.
boolean run_carrier = false; // For manual mode only. Toggle for allowing carrier to run.
boolean ENABLE = true; // Toggle for enabling or disabling motors.
boolean spool_in = true; // spool direction indicator.
boolean mot1_toggle = LOW;
boolean mot2_toggle = LOW;
boolean carrier_dir = false;
void setup() {
lcd.begin(16, 2);
//Serial.begin(9600);
pinMode(mot1, OUTPUT);
pinMode(mot2, OUTPUT);
pinMode(dir1, OUTPUT);
pinMode(dir2, OUTPUT);
pinMode(enable_control, OUTPUT);
pinMode(ledlight, OUTPUT);
pinMode(button_left, INPUT);
pinMode(button_right, INPUT);
pinMode(button_sync, INPUT);
pinMode(button_spoolA, INPUT);
pinMode(button_spoolB, INPUT);
pinMode(button_enable, INPUT);
pinMode(pos1_di, INPUT);
pinMode(pos2_di, INPUT);
digitalWrite(enable_control, ENABLE);
digitalWrite(dir1,LOW); // We start with spooler to spool in.
//digitalRead(pos1_di, HIGH);
//digitalWrite(dir1, LOW); // We start with spooler to spool in.
//digitalRead(pos2_di, HIGH);
// digitalWrite(dir1, HIGH); // We start with spooler to spool in.
attachInterrupt(pos1_di, dir_to_low, FALLING); // Sensors are normally HIGH. Hence we trigger as soon as detected by falling edge.
attachInterrupt(pos2_di, dir_to_high, FALLING);
// Some LCD initialisation
// lcd.init(2, 16);
//lcd.backlight();
redraw_lcd();
blink_led();
// Reading the wiresize from EEPROM:
//wiresize = 1.00;
//EEPROM_writefloat(0, wiresize);
wiresize = EEPROM_readfloat(0);
speed_ratio = reducerratio * leadscrewpitch / wiresize;
}
// THREAD 1: Controls motor 1: THE SPOOLER
extern int protothread1(unsigned long interval) {
if(micros() - timestamp_1 > interval ) {
timestamp_1 = micros();
mot1_toggle ^= 1;
digitalWrite(mot1, mot1_toggle);
if (mot1_toggle) {
if (spool_in) stepcount++;
else stepcount--;
if (stepcount == step_per_full_rev) {
turncount++;
stepcount = 0;
}
else if (stepcount == 0) {
turncount--;
stepcount = step_per_full_rev;
}
}
}
}
// THREAD 2: Controls motor 2: THE CARRIER
extern int protothread2(unsigned long interval) {
if(micros() - timestamp_2 > interval ) {
timestamp_2 = micros();
mot2_toggle ^= 1;
digitalWrite(mot2, mot2_toggle);
}
}
// THREAD 3: Just for some events every seconds. LCD serial debug etc...
extern int protothread3(int interval) {
if (millis() - timestamp_3 > interval ){
timestamp_3 = millis();
//Serial.println(sync);
lcd.setCursor(0,0);
lcd.print(turncount);
set_lcd_direction_status();
//Serial.println("---");
//Serial.println(val);
Serial.println(step_delay1);
Serial.println(step_delay2);
}
}
/////////////////////////////////////////
//MAIN LOOP
/////////////////////////////////////////
void loop() {
val = analogRead(Pot);
step_delay1 = 818400/(6023-val);
protothread3(1500);
/////////////////////////////////////////////////////////////////
// Entering synchronised mode
if (sync) {
step_delay2 = step_delay1 * speed_ratio;
protothread1(step_delay1); // schedule the two protothreads
protothread2(step_delay2); // by calling them infinitely
}
// Entering manual mode
else {
if (run_spool){
protothread1(step_delay1);
}
if (run_carrier) {
protothread2(1700);
run_carrier = false;
}
/////////////////SpoolA BUTTON IS PRESSED//////////////////////
if (digitalRead(button_spoolA) && !ENABLE && millis()-dtime>500) {
digitalWrite(dir1, HIGH);
//protothread1(&pt1, step_delay1);
run_spool ^= 1;
dtime = millis();
spool_in = false;
}
/////////////////SpoolB BUTTON IS PRESSED//////////////////////
if (digitalRead(button_spoolB) && !ENABLE && millis()-dtime>500) {
digitalWrite(dir1, LOW);
//protothread1(&pt1, step_delay1);
run_spool ^= 1;
dtime = millis();
spool_in = true;
}
}
/////////////////SYNC BUTTON IS PRESSED//////////////////////
if (digitalRead(button_sync) && !ENABLE && millis()-dtime>500) {
sync ^= 1;
dtime = millis();
set_lcd_sync_status();
}
////////////////ENABLE BUTTON IS PRESSED//////////////////////
if (digitalRead(button_enable) && millis()-dtime>500) {
ENABLE ^= 1;
sync = false;
run_spool = false;
set_lcd_sync_status();
set_lcd_enable_status();
digitalWrite(enable_control,ENABLE);
dtime = millis();
}
////////////////LEFT BUTTON IS PRESSED//////////////////////
if (digitalRead(button_left) && digitalRead(pos1_di)) {
digitalWrite(dir2, HIGH);
carrier_dir = true;
run_carrier = true; // This will only affect the Manual mode. Ingnored in Sync mode.
//Serial.println("LEFT");
}
////////////////RIGHT BUTTON IS PRESSED//////////////////////
if (digitalRead(button_right) && digitalRead(pos2_di)) {
digitalWrite(dir2, LOW);
carrier_dir = false;
run_carrier = true;
//Serial.println("RIGHT");
}
////////////////ENABLE and SYNC BUTTONS ARE PRESSED//////////////////////
if (digitalRead(button_spoolA) && digitalRead(button_spoolB) && ENABLE && millis()-dtime>500) {
dtime = millis();
lcd.setCursor(0,0);
lcd.print("SET WIRE SIZE ");
lcd.setCursor(0,1);
lcd.print(" ");
set_lcd_wiresize_status();
while (true) {
if (digitalRead(button_spoolA) && digitalRead(button_spoolB) && millis()-dtime>500) {
// JOB DONE - Writing parameter and exiting.
dtime = millis();
speed_ratio = reducerratio * leadscrewpitch / wiresize;
EEPROM_writefloat(0, wiresize);
break;
}
if (digitalRead(button_right) && millis()-dtime>250) {
dtime = millis();
wiresize = wiresize + 0.01;
set_lcd_wiresize_status();
}
if (digitalRead(button_left) && millis()-dtime>250) {
dtime = millis();
wiresize = wiresize - 0.01;
set_lcd_wiresize_status();
}
}
redraw_lcd();
} //END ENABLE/SYNC button pressed if statement
} //END MAIN LOOP
void dir_to_low()
{
digitalWrite(dir2, LOW);
carrier_dir = false;
//Serial.println("LOW");
//blink_led();
}
void dir_to_high()
{
digitalWrite(dir2, HIGH);
carrier_dir = true;
//Serial.println("HIGH");
//blink_led();
}
void set_lcd_sync_status() {
lcd.setCursor(12,0);
if (sync) {
lcd.print("Sync");
}
else {
lcd.print("Manu");
}
}
void set_lcd_enable_status() {
lcd.setCursor(8,1);
if (ENABLE) {
lcd.print("DISABLED");
}
else {
lcd.print(" ENABLED");
}
}
void set_lcd_direction_status() {
lcd.setCursor(0,1);
//Serial.println(carrier_dir);
if (carrier_dir) {
lcd.print("<=");
}
else {
lcd.print("=>");
}
//lcd.print(int(step_delay1));
}
void set_lcd_wiresize_status() {
lcd.setCursor(0,1);
lcd.print(wiresize);
lcd.print("mm");
}
void redraw_lcd(){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,0);
set_lcd_sync_status();
set_lcd_direction_status();
set_lcd_enable_status();
//Serial.println("redraw");
}
void blink_led(){
digitalWrite(ledlight,HIGH);
delay(2);
digitalWrite(ledlight,LOW);
}
void led_on(){
digitalWrite(ledlight,HIGH);
}
void led_off(){
digitalWrite(ledlight,LOW);
}
void EEPROM_writefloat(int ee, float value)
{
byte* p = (byte*)(void*)&value;
for (int i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
}
float EEPROM_readfloat(int ee)
{
double value = 0.0;
byte* p = (byte*)(void*)&value;
for (int i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return value;
}