Wiring puzzle

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

Ha már LED villogtató, vagy soros port, vagyis "játék", hagy mutassam meg egy alkalmazásomat, ami tényleg játék, és a Wiringre íródott.

A panel
Kép

A kijelzőkép
Kép

Kapcsolás
Kép

Wiring program
http://dl.dropbox.com/u/998596/Puzzle_v12.pde
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A program - az utókornak:

Kód: Egész kijelölése

/*
  Projekt:       GAME - Wiring
  Fájlnév:       PUZZLE_V12.PDE
  Dátum:         2011.06.01.
  Mcu:           ATMega128
  Program:       Wiring 0027
  Verziószám:    V1.2
  Szerző:        Szegő János
  E-mail:        szego@umszki.hu
*/

#include "LiquidCrystal.h"

boolean bad_key;
boolean sound_ena;
boolean game_start;
boolean manual_end;
boolean field_ready;

unsigned char cols[] = {30, 29, 28};
unsigned char rows[] = {27, 26, 25, 24};
unsigned char button[] = {1, 4, 7, 11, 2, 5, 8, 10, 3, 6, 9, 12};
unsigned char counter;
unsigned char key_num;
unsigned char key_input;
unsigned char item_index;

unsigned char row;
unsigned char col;

unsigned int byte_counter;
unsigned int steps;
unsigned int seconds;
unsigned int minutes;
unsigned int item[10];
unsigned int temp;
unsigned int limit;

unsigned long previousTime = 0;

LiquidCrystal lcd = LiquidCrystal(39, 38, 37, 5);

void setup() {
  keypad_init();
}

void keypad_init() {
  for (row=0; row<4; row++) {
    pinMode(rows[row],INPUT);           // rows: bemenetek
    digitalWrite(rows[row],HIGH);	// felhúzó ellenállások konfigurálása
  }
  for (col=0; col<3; col++) {
    pinMode(cols[col],OUTPUT);	        // cols: kimenetek
    digitalWrite(cols[col],HIGH);	// nyugalmi magas szintek beállítása
  }
}

void getkey() {
  counter = 0;
  key_input = 12;
  for (col=0; col<3; col++) {
    digitalWrite(cols[col],LOW);
    for (row=0; row<4; row++) {
      if (digitalRead(rows[row])==0) {
        key_input = counter;
      }  
      counter++;
    }
    digitalWrite(cols[col],HIGH);
  }
}

void display_init() {
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("   *** Puzzle ***"); 
  lcd.setCursor(0, 3);
  lcd.print("Press a Key to Begin"); 
  key_input = 12;
  while(key_input==12) {
    getkey();
  }  
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("|   |"); 
  lcd.setCursor(2, 1);
  lcd.print("|   |"); 
  lcd.setCursor(2, 2);
  lcd.print("|   |  Mixing"); 
  lcd.setCursor(9, 0);
  lcd.print("----------"); 
  lcd.setCursor(2, 3);
  lcd.print("-----------------"); 
}

void game_inic() {
  item[1] = 1;
  item[2] = 2;
  item[3] = 3;
  item[4] = 4;
  item[5] = 5;
  item[6] = 6;
  item[7] = 7;
  item[8] = 8;
  item[9] = 32;
  limit = millis();
  for (byte_counter=0; byte_counter<limit; byte_counter++) {
    key_num = random(10);
    if (key_num == 0) {
       key_num = random(10);
    conversion();
    push_item();
    }    
  }
  lcd.setCursor(9, 2);
  lcd.print("Get Ready"); 
  delay(2000);
  lcd.setCursor(9, 1);
  lcd.print("Step "); 
  lcd.print(steps); 
  lcd.setCursor(9, 2);
  lcd.print("Time "); 
  time_write();
}

void time_write() {
  lcd.setCursor(14, 2);
  if (minutes<10) {
    lcd.print("0");
  }  
  lcd.print(minutes); 
  lcd.print(":"); 
  if (seconds<10) {
    lcd.print("0");
  }  
  lcd.print(seconds); 
}

void conversion() {
   for (counter=1; counter<10; counter++) {
      if (item[counter]==key_num) {
        item_index = counter;
        counter = 10;  
      }  
   }
}

void field_write() {
  lcd.setCursor(3, 0);
  for (counter=1; counter<4; counter++) {
    if (item[counter]==32) { 
      lcd.print(" ");
    }
    else {
      lcd.print(item[counter]);
    }
  }
  lcd.setCursor(3, 1);
  for (counter=4; counter<7; counter++) {
    if (item[counter]==32) { 
      lcd.print(" ");
    }
    else {
      lcd.print(item[counter]);
    }
  }
  lcd.setCursor(3, 2);
  for (counter=7; counter<10; counter++) {
    if (item[counter]==32) { 
      lcd.print(" ");
    }
    else {
      lcd.print(item[counter]);
    }
  }
  if (game_start==true) {
    lcd.setCursor(9, 1);
      steps++;
      lcd.print("Step ");
      lcd.print(steps);
      good_signal();
  }
}  
  
void push_item() {
  switch (item_index) {
      case 1:
        if (item[2]==32) {
          item[2] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[4]==32) {
            item[4] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            bad_key = true;
          }
        }  
        break;
      case 2:
        if (item[1]==32) {
          item[1] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[3]==32) {
            item[3] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            if (item[5]==32) {
              item[5] = item[item_index];
              item[item_index] = 32;
              field_write();
            }
            else {
              bad_key = true;
            }
          }
        }  
        break;
      case 3:
        if (item[2]==32) {
          item[2] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[6]==32) {
            item[6] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            bad_key = true;
          }
        }  
        break;
      case 4:
        if (item[1]==32) {
          item[1] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[5]==32) {
            item[5] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            if (item[7]==32) {
              item[7] = item[item_index];
              item[item_index] = 32;
              field_write();
            }
            else {
              bad_key = true;
            }
          }
        }  
        break;
      case 5:
        if (item[2]==32) {
          item[2] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[4]==32) {
            item[4] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            if (item[6]==32) {
              item[6] = item[item_index];
              item[item_index] = 32;
              field_write();
            }
            else {
              if (item[8]==32) {
                item[8] = item[item_index];
                item[item_index] = 32;
                field_write();
              }
              else {
                bad_key = true;
              }
            }
          }
        }  
        break;
      case 6:
        if (item[3]==32) {
          item[3] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[5]==32) {
            item[5] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            if (item[9]==32) {
              item[9] = item[item_index];
              item[item_index] = 32;
              field_write();
            }
            else {
              bad_key = true;
            }
          }
        }  
        break;
      case 7:
        if (item[4]==32) {
          item[4] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[8]==32) {
            item[8] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            bad_key = true;
          }
        }  
        break;
      case 8:
        if (item[5]==32) {
          item[5] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[7]==32) {
            item[7] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            if (item[9]==32) {
              item[9] = item[item_index];
              item[item_index] = 32;
              field_write();
            }
            else {
              bad_key = true;
            }
          }
        }  
        break;
      case 9:
        if (item[6]==32) {
          item[6] = item[item_index];
          item[item_index] = 32;
          field_write();
        }
        else {
          if (item[8]==32) {
            item[8] = item[item_index];
            item[item_index] = 32;
            field_write();
          }
          else {
            bad_key = true;
          }
        }  
        break;
  }    
}

void good_signal() {
  if (sound_ena==true) {
    tone(23, 523, 200);
  }
}

void bad_signal() {
  if (sound_ena==true) {
    tone(23, 220, 100);
  }
}

void time_increment() {
  previousTime = millis();
  seconds++;
  if (seconds>59) {
    seconds = 0;
    minutes++;
    if (minutes>59) {
      minutes = 0;
    }
  }
  time_write();
}

void result_check() {
  if ((item[1]==1) && (item[2]==2) && (item[3]==3) && (item[4]==4) && (item[5]==5) && (item[6]==6) && (item[7]==7) && (item[8]==8)) {
    field_ready = true;
  }
}

void loop() {
  while (1) {
    steps = 0;
    seconds = 0;
    minutes = 0;
    sound_ena = true;
    game_start = false;
    manual_end = false;
    display_init();
    game_inic();
    previousTime = millis();  
    game_start = true;
    bad_key = false;
    field_ready = false;
    while((manual_end==false) && (field_ready==false)) {
      key_input = 0;
      delay(50);  
      while(key_input!=12) {    // elengedésre vár
        if((millis() - previousTime) >= 1000 ) {  
          time_increment();
        }
        getkey();
      }  
      delay(50);  
      while(key_input==12) {    // megnyomásre vár
        if((millis() - previousTime) >= 1000 ) {  
          time_increment();
        }
        getkey();
      }  
      key_num = button[key_input];
      if (key_num<9) {
        conversion();
        push_item();
        result_check();
      }
      if (key_num==11) {
        manual_end = true;
      }
      if (key_num==12) {
        if (sound_ena==false) {
          sound_ena = true;
        }
        else {
          sound_ena = false;
        }
      }
      if (bad_key==true) {
        bad_key = false;
        bad_signal();
      }
      if (field_ready==true) {
        delay(200);
        good_signal();
        delay(200);
        good_signal();
      }
    }
  }
}
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

Róbert!
Köszönöm hogy beillesztetted a listát. Én sosem fogom megtanulni az üzenetküldés fortélyait.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nagyon jó, gratulálók!
Végre valaki mer publikálni!
Remélem, lesznek követőid!
És a képek, többet érnek 1 oldal szövegelésnél!

Meg kérhetlek, írd le részletesen hogyan oldottad meg a képek beszúrását!
Nekem ezt még eddig nem sikerült megoldanom! És a linkek beszúrásával sem boldogulok!
Majd megkérjük, Robertet tegye ki a „Hogyan küldj hozzászólást?” kiemelt oldalra.
Jól jönne ezekhez, a mindig kéznél levő help!
:D

Ui.: A programod zseniális! :)
Kár, hogy a Viring elrejti a HW bekötéseket!
Így akinek nincsen ilyen, nem ismeri, nem látja mi hova van bekötve. (az M128 <-> Perifériák?)
Pedig már csak kíváncsiságból megépíteném. Hogy lássam a programot működés közben!
:?:
A hozzászólást 3 alkalommal szerkesztették, utoljára kapu48 2011. augusztus 9. kedd, 11:09-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A fórum mellékletbeszúráson dolgozom.....
Így egyszerűbb és egy helyen lenne....

Valamint a WikiMedia készül.
Tesztelőnek lehet jönni :)

Tegnap már feléledt....
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

Kapu48!

A programot eredetileg a versenyre szántam, de mikor Róberttel a Wiring előnyeiről írtatok, úgy gondoltam, inkább felrakom az oldalra.
És így jobban is jártam, megmondom őszintén, nagyon jól estek a dícsérő szavaid.

A képek feltöltéséhez a http://www.kepfeltoltes.hu címet használom, feltöltés után kapott linket másolom a fórumba.

Egy kép a Wiringról (http://wiring.org.co/hardware/previous.html)
Kép

A Wiring kapcsolási rajza, ami mutatja az M128 bekötését, a kontroller kapcsolatát a portokkal
http://wiring.org.co/download/wiring-Rev0004.pdf
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Wiring az van felém is - pont a Mega128/1281 chip könnyű szerelhetősége miatt.
http://avr.tavir.hu/modules.php?name=As ... =167&cid=7

És a Wiring-Arduino közelharc miatt készül egy cikk is belőle, előny/hátrány/történet megközelítésben....


A verseny nem zárja ki azt, hogy valahol már publikálva volt :)
A saját prg az elvárás:)....
Válasz küldése