Kassaskåp för kylda drycker.

Kanske inte håller Jönssonligan borta.

Ett USB-kylskåp har blivit en säker plats för mina kylda drycker.

Grön lampa lyser när det är öppet och röd vid låst.

Servot är monterat som en regel som åker ner och låser.

Kanske vore det smartare att satta regeln på insidan?

Kablarna till potensiometern och lysdioderna är limmade med superlim.

På baksidan sitter uno-kortet och kopplingsplattan med

dubbelhäftande tejp.

Kablarna till potensiometern och lysdioderna måste lödas.

/*

Experiment med Arduino Uno R3

Potesiometer med en siffer skala

Ett servo som lås

Detta koppling och program är skapat av Per-Anders Hult.

Denna skript ar publicerad för det kit och komponenter som vi

säljer på Tradera under namnet pc_h

Denna skript får av andra personer endast användas privat bruk.

Om all text i denna anmärkning bibehålls, får denna skript ändras och förbättras och publiceras igen.

Om den översätts till annat språk måste även denna text översättas.

Första publicering på : http://sites.google.com/site/pcharduino/kassaskaap

Om du publicerar denna skript igen, så skriv ditt namn eller alias här.

Denna skript är ändrad av: (skriv ditt namn här)

*/

#include <Servo.h>

Servo LasServo;

#define SafeDebug 0

#define STATUS_LAST 0 //Status låst

#define STATUS_OPPEN 1 //Status Öppen

int Status = STATUS_LAST;

#define VRED_PIN 3 //Analog 3

#define ROD_LED_PIN 7 //Röd LED

#define GRON_LED_PIN 8 //Grön LED

#define SERVO_PIN 9 //Röd LED

//För att justera gränsvärden, starta debugger,

//genom att ändra till 'SafeDebug 1'

//Få fram gränsvärden genom att peka mellan två siffror.

//Första gräns får inte vara noll, måste vara en bit över.

//Samma gäller sista värdet, måste vara en bit under 1023.

int Granser[8] = {31, 168, 325, 457, 592, 732, 887, 1020}; //Gränser

int KodPekareBotten = 0; //Det låga talet, alltså vänster vridning till talet

int KodPekareTopp = 1; //Det höga talet, alltså högervridningar till talet

//Koden har en regel.

//Var annan gång måste siffran vara högre än föregående

//och var annan gång lägre.

//Altså vrid höger, vänster, höger, vänster...

//OK då, en regel till måste börja med noll.

//men noll används inte så koden är 725393.

//OK en regel till..., får inte sluta med noll.

//

//

#define ANTAL_SIFFROR_I_KOD 7

int Kod[ANTAL_SIFFROR_I_KOD] = {0, 7, 2, 5, 3, 9, 3}; //Koden

int Siffra = 1;

void setup() {

#if SafeDebug > 0

Serial.begin(9600);

#endif

pinMode(GRON_LED_PIN, OUTPUT);

pinMode(ROD_LED_PIN, OUTPUT);

digitalWrite(GRON_LED_PIN, LOW);

digitalWrite(ROD_LED_PIN, HIGH);

analogReference(DEFAULT);

LasServo.attach(SERVO_PIN,610,2500);

LasServo.writeMicroseconds(1500);

Status = STATUS_OPPEN;

Las();

Oppna();

Las();

}

void loop(){

int AnalogtTal = analogRead(VRED_PIN); // read the input pin

Siffra = HamtaSiffra(AnalogtTal);

//Kontrollera om högervridning kommit till det utpekade talet

if(Siffra == Kod[KodPekareTopp]){

//Första gången detta händer är när vridning till 7 skett. sedan 5 och 9

//öka pekaren för låga talet med ett över topp pekaren.

KodPekareBotten = KodPekareTopp + 1;

}

//Kontrollera om vridning till höger gått för långt.

if(Siffra > Kod[KodPekareTopp]){

//Vridigt för långt, noll-ställ

KodPekareBotten = 0;

KodPekareTopp = 1;

}

//Kontrollera om vänstervridning kommit till det utpekade talet

if(Siffra == Kod[KodPekareBotten]){

//öka pekaren för höga talet med ett över botten pekaren.

KodPekareTopp = KodPekareBotten + 1;

}

//Kontrollera om vridning till vänster gått för långt.

if(Siffra < Kod[KodPekareBotten]){

//Vridigt för långt, noll-ställ

KodPekareBotten = 0;

KodPekareTopp = 1;

}

//Kontrollera om någon av pekarna kommit sista siffran

if (KodPekareBotten == ANTAL_SIFFROR_I_KOD){

Oppna(); //Sista siffran var låg, öppna låset

}

if (KodPekareTopp == ANTAL_SIFFROR_I_KOD){

Oppna(); //Sista siffran var hög, öppna låset

}

//Kontrollera om noll-ställd

if(KodPekareBotten + KodPekareTopp == 1){

Las(); //Lås

}

#if SafeDebug == 1

Serial.print("AnalogtTal");Serial.print("=");Serial.println(AnalogtTal);

Serial.print("Siffra");Serial.print("=");Serial.println(Siffra);

Serial.print("KodPekareBotten");Serial.print("=");Serial.println(KodPekareBotten);

Serial.print("KodPekareTop");Serial.print("=");Serial.println(KodPekareTop);

delay(3000);

#endif

}

//Denna subrutin öppnar

void Oppna(){

LasServo.write(120);

Status = STATUS_OPPEN;

delay(500);

digitalWrite(GRON_LED_PIN, HIGH);

digitalWrite(ROD_LED_PIN, LOW);

}

//Denna låser

void Las(){

if(Status == STATUS_OPPEN){

LasServo.write(30);

Status = STATUS_LAST;

delay(500);

digitalWrite(GRON_LED_PIN, LOW);

digitalWrite(ROD_LED_PIN, HIGH);

}

}

//Denna sub får det analoga talet

//och omvandlar till en siffra.

//Med hjälp av gränsvärden

//Returnerar siffran

int HamtaSiffra(int AnalogTal){

int tillbaka = 1;

int i;

for (i = 0; i < 8; i++) {

if(Granser[i] < AnalogTal){

tillbaka = i + 2;

}

}

return tillbaka;

}