Arduino Polska Forum

Pełna wersja: Klawiatura membranowa - konfiguracja
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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;
}
ale bieda na tym forum lol