Operácie

Zariadenie na vytvrdzovanie resinu pre MLSA 3D tlačiarne: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDTV (diskusia | príspevky)
Bez shrnutí editace
StudentDTV (diskusia | príspevky)
Riadok 35: Riadok 35:
<tabs>
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <LiquidCrystal.h>
#include<EEPROM.h>
#include <Stepper.h>


int main(void)
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int stepsPerRevolution = 1027;
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);
const int kontakt=A5;
const int diode= 12;
const int stsp = A0;
const int inc = A1;
const int dec = A2;
const int set = A3;
const int relay = 8;
int hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
bool RUN = true;
bool min_flag = true;
bool hrs_flag = true;
void setup()
{
{
   unsigned int measuredValue;
   lcd.begin(16, 2);
 
  lcd.clear();
   while (1)
   lcd.setCursor(0, 0);
  lcd.print("COUNTDOWN TIMER");
  pinMode(stsp, INPUT_PULLUP);
  pinMode(kontakt, INPUT_PULLUP);
  pinMode(inc, INPUT_PULLUP);
  pinMode(dec, INPUT_PULLUP);
  pinMode(set, INPUT_PULLUP);
  pinMode(relay, OUTPUT);
  pinMode(diode,OUTPUT);
  digitalWrite(relay, LOW);
  digitalWrite(diode, LOW);
  if (EEPROM.read(add_chk) != check_val)
  {
    EEPROM.write(add_chk, check_val);
    EEPROM.write(add_hrs, 0);
    EEPROM.write(add_min, 1);
  }
  else
   {
   {
     /*  relax  */ 
     hrs = EEPROM.read(add_hrs);
    Min = EEPROM.read(add_min);
   }
   }
 
  delay(1500);
   return(0);
  myStepper.setSpeed(15);
   INIT();
}
}


</source></tab>
void loop()
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
{
#include <avr/io.h>


void adc_init(void);                                   // A/D converter initialization
  if (digitalRead(stsp) == LOW)
  {
    lcd.clear();
    delay(250);
    RUN = true;
    while (RUN)
    {
      if (digitalRead(stsp) == LOW)
      {
        delay(1000);
        if (digitalRead(stsp) == LOW)
        {
          digitalWrite(relay, LOW);
          digitalWrite(diode,LOW);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("  TIMER STOPPED");
          lcd.setCursor(0, 1);
          lcd.print("----------------");
          delay(2000);
          RUN = false;
          INIT();
          break;
        }
      }
      if (digitalRead(kontakt) == LOW)
      {
        digitalWrite(diode, HIGH);
        myStepper.step(stepsPerRevolution/4);
        sec = sec - 1;
      }
      else{
        digitalWrite(diode, LOW);
      }
      digitalWrite(relay, HIGH);
      if (sec == -1)
      {
        sec = 59;
        Min = Min - 1;
      }
      if (Min == -1)
      {
        Min = 59;
        hrs = hrs - 1;
      }
      if (hrs == -1) hrs = 0;
      lcd.setCursor(0, 1);
      lcd.print("****************");
      lcd.setCursor(4, 0);
      if (hrs <= 9)
      {
        lcd.print('0');
      }
      lcd.print(hrs);
      lcd.print(':');
      if (Min <= 9)
      {
        lcd.print('0');
      }
      lcd.print(Min);
      lcd.print(':');
      if (sec <= 9)
      {
        lcd.print('0');
      }
      lcd.print(sec);
      if (hrs == 0 && Min == 0 && sec == 0)
      {
        digitalWrite(relay, LOW);
        lcd.setCursor(4, 0);
        RUN = false;
        digitalWrite(diode, LOW);
        INIT();
      }
    }
  }
  if (digitalRead(set) == LOW)
  {
    delay(500);
    while (min_flag)
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SET MINUTE: ");
      lcd.print(Min);
      delay(100);
      if (digitalRead(inc) == LOW)
      {
        Min = Min + 1;
        if (Min >= 60) Min = 0;
        delay(100);
      }
      if (digitalRead(dec) == LOW)
      {
        Min = Min - 1;
        if (Min <= -1) Min = 0;
        delay(100);
      }
      if (digitalRead(set) == LOW)
      {
        min_flag = false;
        delay(250);
      }
    }
    while (hrs_flag)
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SET HOUR: ");
      lcd.print(hrs);
      delay(100);
      if (digitalRead(inc) == LOW)
      {
        hrs = hrs + 1;
        if (hrs > 23) hrs = 0;
        delay(100);
      }
      if (digitalRead(dec) == LOW)
      {
        hrs = hrs - 1;
        if (hrs <= -1) hrs = 0;
        delay(100);
      }
      if (digitalRead(set) == LOW)
      {
        hrs_flag = false;
        delay(250);
      }
    }
    if (hrs == 0 && Min == 0)
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("  INVAID TIME");
      delay(2000);
    }
    else
    {
      EEPROM.write(add_hrs, hrs);
      EEPROM.write(add_min, Min);
    }
    INIT();
  }
}


unsigned int adc_read(char a_pin);
void INIT()
</source></tab>
{
  hrs = EEPROM.read(add_hrs);
  Min = EEPROM.read(add_min);
  sec = 0;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Start / Set Time");
  lcd.setCursor(4, 1);
  if (hrs <= 9)
  {
    lcd.print('0');
  }
  lcd.print(hrs);
  lcd.print(':');
  if (Min <= 9)
  {
    lcd.print('0');
  }
  lcd.print(Min);
  lcd.print(':');
  if (sec <= 9)
  {
    lcd.print('0');
  }
  lcd.print(sec);
  min_flag = true;
  hrs_flag = true;
  delay(500);
}
</tabs>
</tabs>


Riadok 62: Riadok 274:


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]


=== Overenie ===
=== Overenie ===

Verzia z 15:29, 23. jún 2023

Záverečný projekt predmetu DTV / LS2023 - Jakub Tinák


Úvod

Vytvrdzovanie resinu po 3D tlači je súčasťou post Procesingu, aby som sa nemusel spoliehať na prirodzený zdroj UV-svetla -> slnko, som sa rozhodol ako semestrálny projekt vypracoavť zariadenie ktoré mi s tým pomôže.

Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

Realizácia sa dá rozdeliť na 3 časti: -Elektrická časť

                                     -Fyzická časť
                                     -Programové riešenie

Inšpiráciou pre elektrickú a programovú časť mi bol Arduino Countdown Timer. Zapojenie som rozšíril o krokový motor a jeden obvod s kontaktom, na základe tohto som som upravil aj program.

Nezabudnite doplniť schému zapojenia!

Schéma zapojenia LCD displeja.


Algoritmus a program

Algoritmus programu je....


<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">

  1. include <LiquidCrystal.h>
  2. include<EEPROM.h>
  3. include <Stepper.h>

const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); const int stepsPerRevolution = 1027; Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11); const int kontakt=A5; const int diode= 12; const int stsp = A0; const int inc = A1; const int dec = A2; const int set = A3; const int relay = 8; int hrs = 0; int Min = 0; int sec = 0; unsigned int check_val = 50; int add_chk = 0; int add_hrs = 1; int add_min = 2; bool RUN = true; bool min_flag = true; bool hrs_flag = true; void setup() {

 lcd.begin(16, 2);
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("COUNTDOWN TIMER");
 pinMode(stsp, INPUT_PULLUP);
 pinMode(kontakt, INPUT_PULLUP);
 pinMode(inc, INPUT_PULLUP);
 pinMode(dec, INPUT_PULLUP);
 pinMode(set, INPUT_PULLUP);
 pinMode(relay, OUTPUT);
 pinMode(diode,OUTPUT);
 digitalWrite(relay, LOW); 
 digitalWrite(diode, LOW); 
 if (EEPROM.read(add_chk) != check_val)
 {
   EEPROM.write(add_chk, check_val);
   EEPROM.write(add_hrs, 0);
   EEPROM.write(add_min, 1);
 }
 else
 {
   hrs = EEPROM.read(add_hrs);
   Min = EEPROM.read(add_min);
 }
 delay(1500);
 myStepper.setSpeed(15);
 INIT();

}

void loop() {

 if (digitalRead(stsp) == LOW)
 {
   lcd.clear();
   delay(250);
   RUN = true;
   while (RUN)
   {
     if (digitalRead(stsp) == LOW)
     {
       delay(1000);
       if (digitalRead(stsp) == LOW)
       {
         digitalWrite(relay, LOW); 
         digitalWrite(diode,LOW);
         lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("  TIMER STOPPED");
         lcd.setCursor(0, 1);
         lcd.print("----------------");
         delay(2000);
         RUN = false;
         INIT();
         break;
       }
     }
     if (digitalRead(kontakt) == LOW)
     {
       digitalWrite(diode, HIGH);
       myStepper.step(stepsPerRevolution/4);
       sec = sec - 1;
     }
     else{
       digitalWrite(diode, LOW);
     }
     digitalWrite(relay, HIGH); 
     if (sec == -1)
     {
       sec = 59;
       Min = Min - 1;
     }
     if (Min == -1)
     {
       Min = 59;
       hrs = hrs - 1;
     }
     if (hrs == -1) hrs = 0;
     lcd.setCursor(0, 1);
     lcd.print("****************");
     lcd.setCursor(4, 0);
     if (hrs <= 9)
     {
       lcd.print('0');
     }
     lcd.print(hrs);
     lcd.print(':');
     if (Min <= 9)
     {
       lcd.print('0');
     }
     lcd.print(Min);
     lcd.print(':');
     if (sec <= 9)
     {
       lcd.print('0');
     }
     lcd.print(sec);
     if (hrs == 0 && Min == 0 && sec == 0)
     {
       digitalWrite(relay, LOW); 
       lcd.setCursor(4, 0);
       RUN = false;
       digitalWrite(diode, LOW);
       INIT();
     }
   }
 }
 if (digitalRead(set) == LOW)
 {
   delay(500);
   while (min_flag)
   {
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("SET MINUTE: ");
     lcd.print(Min);
     delay(100);
     if (digitalRead(inc) == LOW)
     {
       Min = Min + 1;
       if (Min >= 60) Min = 0;
       delay(100);
     }
     if (digitalRead(dec) == LOW)
     {
       Min = Min - 1;
       if (Min <= -1) Min = 0;
       delay(100);
     }
     if (digitalRead(set) == LOW)
     {
       min_flag = false;
       delay(250);
     }
   }
   while (hrs_flag)
   {
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("SET HOUR: ");
     lcd.print(hrs);
     delay(100);
     if (digitalRead(inc) == LOW)
     {
       hrs = hrs + 1;
       if (hrs > 23) hrs = 0;
       delay(100);
     }
     if (digitalRead(dec) == LOW)
     {
       hrs = hrs - 1;
       if (hrs <= -1) hrs = 0;
       delay(100);
     }
     if (digitalRead(set) == LOW)
     {
       hrs_flag = false;
       delay(250);
     }
   }
   if (hrs == 0 && Min == 0)
   {
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("  INVAID TIME");
     delay(2000);
   }
   else
   {
     EEPROM.write(add_hrs, hrs);
     EEPROM.write(add_min, Min);
   }
   INIT();
 }

}

void INIT() {

 hrs = EEPROM.read(add_hrs);
 Min = EEPROM.read(add_min);
 sec = 0;
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Start / Set Time");
 lcd.setCursor(4, 1);
 if (hrs <= 9)
 {
   lcd.print('0');
 }
 lcd.print(hrs);
 lcd.print(':');
 if (Min <= 9)
 {
   lcd.print('0');
 }
 lcd.print(Min);
 lcd.print(':');
 if (sec <= 9)
 {
   lcd.print('0');
 }
 lcd.print(sec);
 min_flag = true;
 hrs_flag = true;
 delay(500);

}

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.

Aplikácia.

Video: https://www.youtube.com/watch?v=ZnA87YROfug

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.