Uit Hack42
< Gebruiker:Hack42(Doorverwezen vanaf Butterfly puzzle)
Project: Butterfly Puzzle | |
---|---|
Naam | Butterfly Puzzle |
Door | Moem, Eightdot, SA007, WitchDoc, PeterKKN |
Status | Afgerond |
Madskillz | lassen schilderen elektronica software |
Doel / Omschrijving | |
Butterfly puzzle voor Escape Room Rozet | |
Alle Projecten - Project Toevoegen |
code:
#include "Adafruit_WS2801.h" //#include "Color.h" #include "SPI.h" // Comment out this line if using Trinket or Gemma #define MAX_DEVIATION 80 #define NUMPIXELS 24 #define CLK 2 #define DAT 3 #define OUT 16 typedef uint32_t Color; // Set the first variable to the NUMBER of pixels. 25 = 25 pixels in a row Adafruit_WS2801 strip1 = Adafruit_WS2801(NUMPIXELS, CLK, DAT); Color off = 0x00000000; // Color(0, 0, 0); Color red = 0x00ff0000; //Color(255, 0, 0); Color grn = 0x0000ff00; //Color(0, 255, 0); /* top views * BOARD LAYOUT * ------------------ * | | * | A9 A0 A3 | 9=A9 * | | * | A8 A2 A7 | 6=A7 8=A8 * | | * | NC A1 A6 | 4=A6 * | | * ------------------ * * TYPE LAYOUT * ------------------ * | | * | 1 2 2 | * | | * | 1 4 3 | * | | * | NC 1 3 | * | | * ------------------ * * READING ORDER * ------------------ * | | * | 0 1 2 | * | | * | 3 4 5 | * | | * | NC 6 7 | * | | * ------------------ * */ //uint8_t order[8] = {2, 3, 3, 2, 4, 1, 1, 1}; uint8_t order[8] = {1, 2, 2, 1, 4, 3, 1, 3}; uint8_t analog_channels[8] = {A9, A0, A3, A8, A2, A7, A1, A6}; // white blue ^red _red //uint8_t val[4] = {204, 408, 612, 816}; #define TYPE1L 677 //red down #define TYPE2L 375 //blue #define TYPE3L 204 //white #define TYPE4L 532 //red top #define TYPE1H 816 //red down #define TYPE2H 408 //blue #define TYPE3H 216 //white #define TYPE4H 612 //red top #define TYPEX 816 //defective open circuit uint16_t lval[4] = {TYPE1L, TYPE2L, TYPE3L, TYPE4L}; uint16_t hval[4] = {TYPE1H, TYPE2H, TYPE3H, TYPE4H}; uint8_t state; void myprints(char * str) { if(Serial) { Serial.print(str); } } void myprintc(char str) { if(Serial) { Serial.print(str); } } void myprinti(long int str) { if(Serial) { Serial.print(str); } } void setup(void) { uint8_t i; // Initialize analog channels for(i=0; i<8; i++) { pinMode(analog_channels[i], INPUT); } // set pinMode for opto output pinMode(OUT, OUTPUT); // opto off digitalWrite(OUT, LOW); // init state to wrong state=0; // initialize ledstrip strip1.begin(); strip1.show(); Serial.begin(9600); // All leds off. for(i=0; i<NUMPIXELS; i++) { strip1.setPixelColor(i, off); } strip1.show(); } // no more Serial, will hang if not connected! #define Serial qqqqq void loop() { uint8_t i, j, error=0, inserted=0, correct=0; uint16_t res=0; uint8_t ok=0; Color col=0; inserted =0; // for each butterfly (analog input) for(i=0; i<8; i++) { if((i % 3) == 0) { myprints("\nanalog: "); if(i==6) myprints(" "); } // read value res = analogRead(analog_channels[i]); myprintc(' '); myprinti(res); if (res < 128) { // possible shortcut, count as error error++; inserted++; myprintc('*'); } else if(res > TYPEX-MAX_DEVIATION) { if (res < TYPEX + MAX_DEVIATION) { // possible open circuit, count as error error++; inserted++; myprintc('X'); } } else { // a butterfly is inserted at this socket //get type j=order[i]-1; //for(j=1; j<5; j++) { //check value //<s>test possible values to determine which type it is</s> if ((res < (hval[j]+MAX_DEVIATION)) && (res > (lval[j]-MAX_DEVIATION))) { // Count if this is the correct type correct++; myprintc('='); }else if (res < lval[j]-MAX_DEVIATION) { myprintc('-'); }else if (res > hval[j]+MAX_DEVIATION) { myprintc('+'); } } // Count all inserted butterflies inserted++; } } ok=0; //assume not ok if (inserted > 7) { //was 6 // All butterflies were inserted // TODO error <=2 because testing. if((error <= 3) && ((error + correct) > 7)) { // Minimal amount correct (allow 2 defects), green leds & output high ok=2; } else { // Not in correct order. red leds and output low ok=1; } } myprints(" ins:"); myprinti(inserted); myprints(" err:"); myprinti(error); myprints(" correct:"); myprinti(correct); myprints(" OK:"); myprinti(ok); myprints("\n"); if(state != ok) { // All butterflies were inserted ok if(ok==2) { col = grn; j=HIGH; }else if(ok==1) { // Not in correct order. red leds and output low col = red; j=LOW; }else{ // Not enough inserted (yet). leds and output low col = off; j=LOW; } // turn on the leds for(i=0; i<NUMPIXELS; i++) { strip1.setPixelColor(i, col); } strip1.show(); // set ooutput digitalWrite(OUT, j); state = ok; } else { for(i=0; i<NUMPIXELS; i++) { strip1.setPixelColor(i, off); } strip1.show(); digitalWrite(OUT, LOW); } delay(500); }