Tässä jotain maverickille siitä open sourcesta. Tämän on ensimmäisen version viimeisiä softaversiota, kai.. Tämä on tehty nimenomaan Bounty huntereiden digitaalisen väylän lukemiseen.
Olisi tuon silloin voinut tehdä sivistyneemminkin, mutta tässä brutaali lähestymistapa suoraan paljastimen sielunelämään...
EDIT: Näinköhän tuosta saa mitään selvää
// NOPEUS 43478,26 HZ, mutta jos pulssinleveys onkin hieman vähemmän, nopeus voisi olla 44000HZ.
// BITTIJONOSTA ARVOT 1-7 OVAT SENSITIVITY SAMOIN 29 BITTI
// PERUSTILA:
// 0 0 1 0 0 0 0 000000000000000 0001 000000100 I=34, sen2, BATTERY GOOD
// 011111101101101 0100 001000100 , SEN2, BATTERY FULL
// 111100101001000 0010 000000100 , SEN2, BATTERY LOW
// 0 0 1 0 0 0 0 000000000000000 1000 000000100 , SEN2, BATTERY R
// 000000000000000 0001 000000100 = perus, ei mitään ruudussa
// 0 0 1 0 0 0 0 111011101101111 0001 000000100 == 00 ??
// ------------- --------------- ---- ---------
// Sensitivity ACCU
// TÄMÄ Versio toimii hyvin, yli sadan ID:t pitää korjata, samoin lisätä raudat jne.
// VIELÄ LISÄTTÄVÄÄ:
// SENSITIVITY : Näytölle ja ääni siihen
// BATTERY ALERT: Eli kun varaustaso laskee niin siitä äänellä ilmoitus, ja ruudulle.
// BATTERY FULL (bootissa esim)
// BATTERY LOW
// BATTERY DEPLETED
// Pitää tunnistaa myös shutdown.
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
// INT RS = 8, INT RW=11, ENABLE=9, data pins 4 5 6 7
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
volatile int DLENState = 0;
volatile int BITTIJONO[34];
volatile int BITTIJONO2[34];
volatile int kakkosbitit=0;
volatile int i=0;
volatile int ii=0;
volatile int a=0;
volatile int sen2,sen3,sen4,sen5,sen6,sen7,sen8;
volatile int lcd1,lcd2,lcd3,lcd4,lcd5,lcd6,lcd7,lcd8,lcd9,lcd10,lcd11,lcd12,lcd13,lcd14,lcd31,lcd30,lcd29,lcdsata;
volatile int raudanarvo,rauta1,rauta2,rauta3,rauta4,rauta5,rauta6,rauta7,rauta8,rauta9,rauta10,rauta11,rauta12;
volatile int arvo,kymmenet,ykkoset;
volatile int pass=0;
volatile int boot=0;
volatile int arvoMin = 300; // minimum sensor value
volatile int arvoMax = 0; // maximum sensor value
volatile int avr=0;
volatile int erotus=0;
volatile int arvo2=0;
volatile int rejectiron=0;
volatile int rejectiron2=0;
volatile int depth=0;
volatile int depth2=0;
volatile int depth4=0;
volatile int depth6=0;
volatile int depth8=0;
volatile int depth10=0;
void setup()
{
Serial.begin(43480); // SERIAL SPEED
pinMode(3, INPUT); // SET PIN TO INPUT DATA ENABLE
pinMode(2, INPUT); // SET PIN TO INPUT clock
pinMode(12, INPUT); // SET PIN TO INPUT
pinMode(10, INPUT); // SWITCH INPUT (reject iron)
digitalWrite(10, HIGH); // Switch input pullup HIGH
attachInterrupt(0, pincheck , FALLING); // Interrupt 0 is on DIGITAL PIN 2! (CLOCK)
attachInterrupt(1, dataenable, RISING); // Interrupt 1 is on DIGITAL PIN 3 (DATA ENABLE)
lcd.begin(16, 2); // set up the LCD's number of rows and columns:
lcd.print("-SYSTEM BOOTING-");
lcd.setCursor(0,1);
lcd.print(" -Please wait-");
delay(2800);
tone(11,350,100); // output tone andWait for system to stabilize
lcd.clear();
}
void lcdinit() // Print basic settings on the screen
{
lcd.setCursor(0,0);
lcd.print("Hi:");
lcd.setCursor(0,1);
lcd.print("Lo:");
lcd.setCursor(12,0);
lcd.print("|AVR");
lcd.setCursor(12,1);
lcd.print("|");
lcd.setCursor(7,0);
lcd.print("| ID ");
lcd.setCursor(7,1);
lcd.print("|");
}
void keskiar() // Checks minimum and max value and calc average between those.
{
if (raudanarvo==0){
if (arvo2!=arvo){++pass;}
if (arvo > arvoMax) // record the maximum sensor value
{
arvoMax = arvo;
}
if (arvo < arvoMin) // record the minimum sensor value
{
arvoMin = arvo;
}
arvo2=arvo; //arvo2 voisi laittaa arrayhin ja tehdä siitä isomman averagen kuin pelkästä min ja maksista.
avr=(arvoMin+arvoMax) / 2 ; // Calc the average
erotus=(arvoMax-arvoMin); // -> If erotus = high (over 15) target is propably trash
lcd.setCursor(3,0);lcd.print(arvoMax);
lcd.setCursor(3,1);lcd.print(arvoMin);
lcd.setCursor(9,1);lcd.print(arvo);
lcd.setCursor(13,1);lcd.print(avr);
delay(140);
if (pass>=3) // Check the min/max during a four time "pass"
{
pass=0;
arvoMax=0;
arvoMin=300;
lcd.clear();
if (erotus>=0 && erotus<15) // If erotus<15 take a guess which material the target might be.
{
arvaus();
}
if (erotus>=16) // If erotus>=16, target is propably trash, or new target
{
lcd.clear();
lcd.setCursor(0,0);lcd.print("NEW TARGET/RUST");
lcd.setCursor(0,1);lcd.print(" TRY AGAIN!");
delay (900);
lcd.clear();
lcdinit();
}
}}}
void arvaus() // Guess list of material.
{
if (raudanarvo==0){ // IF target is NOT iron -> proceed
lcd.clear();
lcd.setCursor(0,0);
if (avr>0 && avr<10) {
lcd.print(" FOIL ");
}
if (avr>=10 && avr<=19) {
lcd.print("NICKEL / 10P ");
}
if (avr>=19 && avr<=24) {
lcd.print("GOLD/NICKEL/LEAD");
}
if (avr>=25 && avr<27) {
lcd.print(" NICKEL/GOLD");
}
if (avr>=27 && avr<30) {
lcd.print(" 1MK / PULLTAB");
}
if (avr>=30 && avr<35) {
lcd.print("SILVER/LEAD");
}
if (avr>=35 && avr<=40) {
lcd.print("ALUM/BRASS 10P");
}
if (avr>40 && avr<56) {
lcd.print("BRASS/Al-CAP/2E");
}
if (avr>=56 && avr<=60) {
lcd.print("BRASS/0.1-1 EURO");
}
if (avr>60 && avr<=65) {
lcd.print(" 20 CENT/1 EURO");
}
if (avr>=66 && avr<77) {
lcd.print("COPPER/50C/5MK");
}
if (avr>=77 && avr<80) {
lcd.print("COPPER / SILVER");
}
if (avr>=80 && avr<=85) {
lcd.print("COPPER/5P/SILVER");
}
if (avr>85 && avr<=90) {
lcd.print("SILVER / COPPER");
}
if (avr>90 && avr<95) {
lcd.print("SILVER/COPPER");
}
if (avr>=95 && avr<100) {
lcd.print("SILVER/CU-5P OLD");
}
if (avr>=100 && avr<=105) {
lcd.print("SILVER-CU 1MK");
}
if (avr>105 && avr<=110) {
lcd.print("SILVER/COPPER");
}
if (avr>110 && avr<=120) {
lcd.print("SILVER/COPPER");
}
if (avr>120 && avr<=130) {
lcd.print("SILVER/COPPER");
}
if (avr>130 && avr<=140) {
lcd.print("SILVER/COPPER");
}
if (avr>140 && avr<=160) {
lcd.print("SILVER/COPPER");
}
if (erotus<6 && avr>18 && avr<36) {lcd.setCursor(0,1);lcd.print("GOOD ID,AU-RING?");tone(11,arvo+50,80);delay(1400);}
if (erotus<6 && erotus>=3 && avr>55) {lcd.setCursor(0,1);lcd.print("SOLID ID, COIN?");tone(11,arvo+50,80);delay(1400);}
if (erotus<=3 && avr>55 && avr<80) {lcd.setCursor(0,1);lcd.print("ALKON KORKKI...?");tone(11,arvo+50,80);delay(1400);}
lcd.setCursor(0,1);
lcd.print("A:");
lcd.print(avr);
lcd.print(" D:");lcd.print(depth);lcd.print(" CM ");
tone(11,arvo+60,80);
delay(1800);
erotus=0;
arvo=0;
avr=0;
depth=0;
lcd.clear();
lcdinit();
}}
void bitit() // THis reads the bits from the data lines, these come from interrupt routines.
{
sen2=BITTIJONO[2];
sen3=BITTIJONO[3];
sen4=BITTIJONO[4];
sen5=BITTIJONO[5];
sen6=BITTIJONO[6];
sen7=BITTIJONO[1];
sen8=BITTIJONO[28];
lcd1=BITTIJONO[8];
lcd2=BITTIJONO[7];
lcd3=BITTIJONO[9];
lcd4=BITTIJONO[18];
lcd5=BITTIJONO[19];
lcd6=BITTIJONO[20];
lcd7=BITTIJONO[10];
lcd8=BITTIJONO[12];
lcd9=BITTIJONO[11];
lcd10=BITTIJONO[13];
lcd11=BITTIJONO[14];
lcd12=BITTIJONO[15];
lcd13=BITTIJONO[16];
lcd14=BITTIJONO[21];
lcd31=BITTIJONO[31];
lcd30=BITTIJONO[30];
lcd29=BITTIJONO[29];
lcdsata=BITTIJONO[17];
rauta1=BITTIJONO[10];
rauta2=BITTIJONO[11];
rauta3=BITTIJONO[13];
rauta4=BITTIJONO[14];
rauta5=BITTIJONO[15];
rauta6=BITTIJONO[17];
rauta7=BITTIJONO[18];
rauta8=BITTIJONO[28];
rauta9=BITTIJONO[31];
rauta10=BITTIJONO[32];
rauta11=BITTIJONO[12];
rauta12=BITTIJONO[16];
depth2=BITTIJONO2[17];
depth4=BITTIJONO2[18];
depth6=BITTIJONO2[19];
depth8=BITTIJONO2[20];
depth10=BITTIJONO2[21];
// ---------- TÄSSÄ VÄLISSÄ ON NORMAALI SERIAL PRINT TERMINAALIA VARTEN -----------
for(int u = 0; u < 34; u++){Serial.print(BITTIJONO
,BIN);}
Serial.print(" ");
for(int uu = 0; uu < 34; uu++){Serial.print(BITTIJONO2[uu],BIN);}
Serial.print("noiron ");rejectiron=digitalRead(10);
// Serial.print(rejectiron);
if (rejectiron == HIGH) {Serial.print("HIGH");}
if (rejectiron == LOW) {Serial.print("LOW");}
// ---------------------------------------------------------------------------------
if (lcd1==0 && lcd2==0 && lcd3==1 && lcd4==0 && lcd5 ==0 && lcd6==1 && lcd7==0){ kymmenet=10;}
if (lcd1==1 && lcd2==0 && lcd3==1 && lcd4==1 && lcd5 ==1 && lcd6==0 && lcd7==1){ kymmenet=20;}
if (lcd1==1 && lcd2==0 && lcd3==1 && lcd4==0 && lcd5 ==1 && lcd6==1 && lcd7==1){ kymmenet=30;}
if (lcd1==0 && lcd2==1 && lcd3==1 && lcd4==0 && lcd5 ==0 && lcd6==1 && lcd7==1){ kymmenet=40;}
if (lcd1==1 && lcd2==1 && lcd3==0 && lcd4==0 && lcd5 ==1 && lcd6==1 && lcd7==1){ kymmenet=50;}
if (lcd1==1 && lcd2==1 && lcd3==0 && lcd4==1 && lcd5 ==1 && lcd6==1 && lcd7==1){ kymmenet=60;}
if (lcd1==1 && lcd2==0 && lcd3==1 && lcd4==0 && lcd5 ==0 && lcd6==1 && lcd7==0){ kymmenet=70;}
if (lcd1==1 && lcd2==1 && lcd3==1 && lcd4==1 && lcd5 ==1 && lcd6==1 && lcd7==1){ kymmenet=80;}
if (lcd1==1 && lcd2==1 && lcd3==1 && lcd4==0 && lcd5 ==1 && lcd6==1 && lcd7==1){ kymmenet=90;}
if (lcd1==1 && lcd2==1 && lcd3==1 && lcd4==1 && lcd5 ==0 && lcd6==1 && lcd7==1){ kymmenet=0;} // ei toimi vielä ??
if (lcd31==1 && lcdsata==1) { kymmenet=100;} // Ei toimi vielä?? Lisää myös nollat!
if (lcd8==0 && lcd9==0 && lcd10==1 && lcd11==0 && lcd12==1 && lcd13==0 && lcd14==0){ ykkoset=1;}
if (lcd8==1 && lcd10==1 && lcd11==1 && lcd13==1 && lcd14==1){ ykkoset=2;}
if (lcd8==1 && lcd10==1 && lcd11==1 && lcd12==1 && lcd13==1 && lcd9 == 0 && lcd14 ==0){ ykkoset=3;}
if (lcd9==1 && lcd10==1 && lcd11==1 && lcd12==1 && lcd14==0 && lcd13==0 && lcd8==0){ ykkoset=4;}
if (lcd8==1 && lcd9==1 && lcd11==1 && lcd12==1 && lcd13==1 && lcd10==0 && lcd14==0){ ykkoset=5;}
if (lcd8==1 && lcd9==1 && lcd11==1 && lcd12==1 && lcd13==1 && lcd14==1 && lcd10==0){ ykkoset=6;}
if (lcd8==1 && lcd10==1 && lcd11==0 && lcd12==1 && lcd9==0 && lcd14==0 && lcd13==0){ ykkoset=7;}
if (lcd8==1 && lcd9==1 && lcd10==1 && lcd11==1 && lcd12==1 && lcd13==1 && lcd14==1){ ykkoset=8;}
if (lcd8==1 && lcd9==1 && lcd10==1 && lcd11==1 && lcd12==1 && lcd13==1 && lcd14==0){ ykkoset=9;}
if (lcd8==1 && lcd9==1 && lcd10==1 && lcd11==0 && lcd12==1 && lcd13==1 && lcd14==1){ ykkoset=0;}
if (rauta1==1 && rauta2==0 && rauta3==1 && rauta4==0 && rauta5 ==1 && rauta6==1 && rauta7==1 && 1 && rauta9==1 && rauta10==1){ raudanarvo=1;}
if (rauta1==1 && rauta2==0 && rauta3==1 && rauta4==1 && rauta5 ==0 && rauta6==1 && rauta7==1 && rauta9==1 && rauta10==1 && rauta11==1 && rauta12==1){ raudanarvo=2;}
if (rauta1==1 && rauta2==0 && rauta3==1 && rauta4==1 && rauta5 ==1 && rauta6==1 && rauta7==1 && rauta9==1 && rauta10==1 && rauta11==1 && rauta12==1){ raudanarvo=3;}
if (rauta1==1 && rauta2==1 && rauta3==1 && rauta4==1 && rauta5 ==1 && rauta6==1 && rauta7==1 && rauta9==1 && rauta10==1){ raudanarvo=4;}
if (depth2==1 && depth4==0 && depth6==0 && depth8==0 && depth10==0){depth=5;depth2=0;}
if (depth2==0 && depth4==1 && depth6==0 && depth8==0 && depth10==0){depth=12;depth4=0;}
if (depth2==0 && depth4==0 && depth6==1 && depth8==0 && depth10==0){depth=18;depth6=0;}
if (depth2==0 && depth4==0 && depth6==0 && depth8==1 && depth10==0){depth=22;depth8=0;}
if (depth2==0 && depth4==0 && depth6==0 && depth8==0 && depth10==1){depth=27;depth10=0;}
arvo=kymmenet+ykkoset;
Serial.println(" ");
lcd.clear();
lcdinit();
}
void rauta()
{
if (rejectiron==LOW){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("IRON");
lcd.setCursor(5,0);
lcd.print(raudanarvo);
lcd.print(" DEPTH: ");
lcd.print(depth);
if (raudanarvo==1){
lcd.setCursor(0,1);lcd.print(" VERY SMALL");}
if (raudanarvo==2){
lcd.setCursor(0,1);lcd.print(" SMALL");}
if (raudanarvo==3){
lcd.setCursor(0,1);lcd.print(" MEDIUM");}
if (raudanarvo==4){
lcd.setCursor(0,1);lcd.print(" LARGE");}
tone(11,100,70);
delay (300);
}
raudanarvo=0;
}
void reject(){
if (rejectiron2!=rejectiron){
lcd.clear();
lcd.setCursor(0,0);
if (rejectiron==HIGH){
lcd.print("REJECTING");}
if (rejectiron==LOW){
lcd.setCursor(0,0);
lcd.print("ACCEPTING");}
lcd.setCursor(0,1);
lcd.print("IRON");
delay(2500);
}
rejectiron2=rejectiron;
}
void loop()
{
rejectiron==digitalRead(10);
reject();
if (boot==0){lcdinit();boot=1;arvo=0;}
if (i=34){bitit();}
if (raudanarvo>0){rauta();}
if (arvo>0){keskiar();}
}
//___________________________________________________________________________________________________
// -----------------------ÄLÄ PUUTU NÄIHIN TÄMÄN VIIVAN ALLA OLEVIIN --------------------------------
void pincheck()
{
if (DLENState==1)
{
BITTIJONO = digitalRead(12); // Luetaan DATA portista arvo, portin numero siis 12
++i;
if (i == 34) {i=0; DLENState=0;kakkosbitit=1;}
}
if (kakkosbitit==1)
{
BITTIJONO2[ii] = digitalRead(12);
++ii;
if (ii == 34) {ii=0; kakkosbitit=0;}
}
}
void dataenable()
{
DLENState=1;
}