Stap 5: Uploaden van de code
Ga naar de Arduino kleine projectsite en download de versie arduino-kleine-0100-0010.zip. Volg inbegrepen readme.txt bestand voor stap voor stap instructies op hoe te laten werken met uw arduino omgeving. (Niet echt moeilijk.) Ook, zal u wilt PinChangeInterrupt-0001.zip te downloaden vanaf dezelfde website. Ook de Arduino tijd bibliotheekdownloaden. Installatie van bibliotheken is vrij eenvoudig, in het geval van verwarring verwijzen naar deze site.Vervolgens zet je arduino in zogenaamde isp door het openen van de arduino ide, bestand-voorbeelden-Arduino als ISP selecteren in het dropdownmenu en raken uploadt knoop.
Zodra u hebt gedaan dat, plak de volgende code er, selecteert u tools-bestuur-attiny85 (interne oscillator, BZV uitgeschakeld), plaatst u de attiny-fiche in de aansluiting van de programmeur, breadboard of wat dan ook zoals vermeld hier en gaat u verder met het uploaden.
!!!! BELANGRIJK!!!
Als uploaden mislukt, probeer het uploaden van de arduino als isp schets van een oudere versie van de arduino ide, zoals 0022. Als zelfs dat niet lukt, wellicht hebt u uw verkeerde verbindingen
#define encoderPinA 2
#define encoderPinB 0
#define buttonpin 2
#define loudspeakerpin 1
#include "Time.h"//I niet maken deze bibliotheek
#include "PinChangeInterruptSimple.h"//And ook deze bibliotheek was niet door mij gemaakt
vluchtige int encoderPos = 0; //position van de encoder, vluchtige omdat het verandert op onderbreken
unsigned int lastReportedPos = 1; veranderingsmanagement
statische Booleaanse roterende = false; ontdendering beheer
int stepstochangeitem = 10; Hoeveel encoder stappen zijn nodig voor menu-item te wijzigen
Boole A_set = false; Sommige debouncing verwante vars, wie weet, ik heb niet gedaan dit deel van code
Boole B_set = false;
int items = 4; //number van items in menu
int selecteditem = 0;
int R = 512; //307; //telling welke knop ingedrukt-512 is = pullup weerstand heeft dezelfde waarde als de knop een
int argument numbertype [] = {//roman cijfers; als u deze instelling, neem dan ook verandering de numtypesound matrixvariabele abd typecount wijzigen
50, 10,5,1};
int numbertypesound [] = {//pitches van verschillende cijfers
100, 300, 500, 700};
int typecount = 4; //number van cijfers alltogether
int delaytime = 150;
Boole inmenu = true; / / zijn we nu in menu?
unsigned long presslength = 0; //buttons-for hoe lang is een knop ingedrukt
time management vars hieronder
lange diff = 0; //difference tussen synchroniseert van tijd in millis
lange realdiff = 0; //same zoals hierboven, maar afgerond op halve uren
Const unsigned long hh 1800000; = //half uur in milliseconden
lange drift = 0; //by hoeveel de realdiff van diff verschilt
unsigned long lastmillis = 0;
unsigned long lastcheckedtime = 0;
int onemetervalue = 300; //how lang (in stappen van de encoder) bedraagt maximaal één meter
Boole driftenabled = false; //are we corrigeren van de tijd drijven?
VOID Setup {}
pinMode (encoderPinA, INPUT);
pinMode (encoderPinB, INPUT);
pinMode (buttonpin, INPUT);
pinMode (loudspeakerpin, OUTPUT);
encoder pin op interrupt 0 (pin 2)
attachPcInterrupt (2, doEncoderA, verandering);
encoder pin op interrupt 1 (pin 3)
attachPcInterrupt (0, doEncoderB, verandering);
Serial.begin (9600);
beepnumber (35); //I hou gewoon van het geluid van dat
/ * int tempR=analogRead(buttonpin);
Als (verbran > 5)
{
R = verbran;
playSound(1);
beepnumber(tempR);
encoderPos = 0;
SelectedItem = 0;
delay(500);
}*/
}
int WaardeInstellen (Booleaanse minuten) //set waarde; gebruikt voor klok en ei timer routines
{
[wrapvalues] = {0,2,1,4};
encoderPos = 0; //reset encoder positie
SelectedItem = 0; //reset menu-positie
int returnvalue = 0; de waarde moet worden geretourneerd aan het einde van de functie
int stepnumber = 0; //number van de huidige stap. elke numerieke instelling = 1 stap
int laststepnumber = 0;
while //infinite lus (1) te worden gebroken uit met behulp van de opdracht break
{
inmenu = true; //so dat het piept uit menu-item, die hier is gebruikt om te bepalen hoe vaak u wilt elk cijfer te zijn in uw gewenste nummer
wrapEncValues();
inmenu = false; //resets terug naar de juiste waarde
Als (stepnumber == 0 & & notulen == false) //setting uur? Dan 50-waarde instellen (stap overslaan 0)
{
stepnumber = 1;
laststepnumber = 1;
}
Als (laststepnumber == stepnumber)
{
Als (minuten == false & & stepnumber == 2 & & returnvalue > = 20) //skipping waarde 5 instelling als gebruiker ondergaat uur en heeft ze als > 20 (het opzetten van 25:00 zoals tijd zou niet zinvol)
stepnumber = 3;
Als (minuten == true & & stepnumber == 1 & & returnvalue > = 50) //skipping waarde 10 instelling als gebruiker ondergaat minuten en heeft ze als > 50 (59 is de max waarde voor minuten)
stepnumber = 2;
beepnumber(NumberType[stepnumber]);
laststepnumber =-1;
}
Als (minuten == false)
{
schakelaar (stepnumber)
{
geval 1: / / 10s
items = 2;
breken;
geval 2: / / 5s
Als (returnvalue > = 20) waarde van de //20-something
stepnumber = 3; //skip 5s
items = 1;
breken;
Case 3: / / 1s
Als (returnvalue > = 20) waarde van de //20-something
{
items = 3;
}
anders
items = 4;
breken;
}
}
anders
{
schakelaar (stepnumber)
{
geval van 0: / / 50s
items = 1;
breken;
geval 1: / / 10s
Als (returnvalue > = 50) //50-something waarde
{
stepnumber = 2; //skip 10s
breken;
}
items = 4;
breken;
geval 2: / / 5s
items = 1;
breken;
Case 3: / / 1s
items = 4;
breken;
}
}
Als (buttonpressed()==1)
{
returnValue += argument numbertype [stepnumber] * selecteditem;
stepnumber += 1;
SelectedItem = 0;
laststepnumber = stepnumber;
Als (stepnumber > 3)
{
inmenu = true;
stepstochangeitem = 10;
SelectedItem = 1; //back naar menu
items = 4; //not echt nodig aangezien 'items' allready deze waarde bij toeval hebben zal
retourneren returnvalue;
breken;
}
}
}
}
VOID wrapEncValues()
{
int beepnum =-1;
terwijl (encoderPos > stepstochangeitem)
{
encoderPos = encoderPos-stepstochangeitem;
SelectedItem += 1;
beepnum = selecteditem;
}
terwijl (encoderPos < 0)
{
encoderPos = stepstochangeitem + encoderPos;
SelectedItem-= 1;
beepnum = selecteditem;
}
Als (selecteditem > items)
{
SelectedItem = 0;
beepnum = selecteditem;
}
Als (selecteditem < 0)
{
SelectedItem = items;
beepnum = selecteditem;
}
Als (beepnum! =-1 & & inmenu == true)
beepnumber(beepnum);
}
VOID playSound (int soundtype) //routine voor pieptoon uit specifieke codes (voor nul, het invoeren van programma-, alarm- en "OK piep" die wordt ook gebruikt voor het scheiden van de uren en minuten wanneer tijd weergeven
{
schakelaar (soundtype)
{
geval van 0: / / enter
/ * for (int i = 0; ik < = 100; i ++)
{
Toon (loudspeakerpin, ik * 5);
delay(5);
}
noTone(loudspeakerpin);
*/
Toon (loudspeakerpin, 500,250);
delay(100);
Toon (loudspeakerpin, 800,250);
delay(500);
breken;
geval 1: / / melody
Toon (loudspeakerpin, 200,250);
delay(100);
Toon (loudspeakerpin, 500,500);
delay(50);
breken;
geval 2: / / nul
Toon (loudspeakerpin, 950,250);
delay(50);
Toon (loudspeakerpin, 250,250);
breken;
Case 3: / / dot
delay(100);
Toon (loudspeakerpin, 950,250);
delay(100);
noTone(loudspeakerpin);
Toon (loudspeakerpin, 950,250);
delay(400);
breken;
}
}
void loop
{//Do stuff hier
/ * pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
delayMicroseconds(100000);
digitalWrite(13,LOW); * /
Als (driftenabled == true) //auto tijdcorrectie ingeschakeld
{
Boole setlastcheckedtime = false;
terwijl (nu ()-lastcheckedtime > 3600) //more dan uur verschil sinds de laatste keer dat sync
{
setlastcheckedtime = true; //sync gebeurd
lastcheckedtime += 3600;
adjustTime(drift/1000);
}
Als (setlastcheckedtime == true) //set de tijd van laatste synchronisatie alleen als de synchronisatie gebeurd
lastcheckedtime=Now()-(drift/1000);
}
verplaatste code
wrapEncValues();
Als (Serial.read()=='B')
Serial.println (encoderPos, DEC);
Als (inmenu == true & & buttonpressed()==1)
{
inmenu = false;
playSound(0);
schakelaar (selecteditem)
{
geval van 0: / / klok
Als (presslength < 2000) //press was niet langer dan 2 seconden
{
beepnumber(Hour());
delay(200);
playSound(3);
delay(200);
beepnumber(Minute());
inmenu = true;
breken;
}
anders //longer dan 2 seconden
{
Als (presslength > 5000) //longer dan 5 seconden
{
Als (lastmillis! = 0)
driftenabled = true;
playSound(3);
onderstaande code berekent drift van interne oscillator door het vergelijken van de verwachte vertraging
(die kan worden gemakkelijk geschat, aangezien de gebruiker heeft om de sync op: 30 of: 00) verkregen waarde.
Vervolgens berekent drift, benoemt het tot een uur en worden opgeslagen om te "drijven" variabele
diff = millis ()-lastmillis;
unsigned long compval = hh/2;
int i;
voor (ik = 1; ik < = 10000; i ++)
{
compval += hh;
Als (diff < = compval)
breken;
}
realdiff = i * hh;
drift = realdiff-diff;
Drift=(2*drift)/(realdiff/HH);
lastmillis=Millis();
int hrz=hour();
int minz;
Als (minute() > 15 & & minute() < 45) //assume de klok is niet af met meer dan 15 minuten
minz = 30;
anders
{
Als (minute() > 45)
HRZ += 1;
minz = 0;
}
setTime(hrz,minz,0,1,1,1);
}
anders
{
int hrz=setvalue(false);
int minz=setvalue(true);
setTime(hrz,minz,0,1,1,1);
driftenabled = false;
lastmillis = 0;
lastcheckedtime=Now();
}
inmenu = true;
breken;
}
breken;
geval 1: / / tape maatregel
encoderPos = 0;
while(1)
{
wrapEncValues();
Als (buttonpressed()==1)
{
Als (presslength < 2000)
{
int cms=round(map(abs(encoderPos),0,onemetervalue,0,100));
beepnumber(CMS);
inmenu = true;
stepstochangeitem = 10;
SelectedItem = 1; //back naar menu
items = 4;
encoderPos = 0;
breken;
}
anders / / veronderstellen gebruiker heeft precies één meter gemeten en wil het centimeterlint kalibreren
{
playSound(3);
onemetervalue=ABS(encoderPos);
encoderPos = 0;
inmenu = true;
breken;
}
}
}
breken;
geval 2: / / water detector
{
stepstochangeitem = 4;
items = 10;
SelectedItem = 5;
while(1) {}
wrapEncValues();
Als (abs(selecteditem-5) > 2) //the-sonde gebruikt dezelfde input pin als knoppen; Daarom, om af te sluiten de water detector, gebruiker is verplicht te verdraaien van het coderingsprogramma wiel
{
inmenu = true;
stepstochangeitem = 10;
encoderPos = 0;
SelectedItem = 2; //back naar menu
items = 4;
noTone(loudspeakerpin);
breken;
}
Tone(loudspeakerpin,map(analogRead(buttonpin),0,512,100,1000)); //0-256; 100-500
}
breken;
}
Case 3: / / stopwatch
{
int startingsecs;
Boole watchrunning = false;
terwijl (1)
{
if(buttonpressed()==1)
{
playSound(3);
Als (watchrunning == false)
{
watchrunning = true;
startingsecs = millis () / 1000;
}
anders
{
watchrunning = false;
beepnumber(Millis()/1000-startingsecs);
inmenu = true;
SelectedItem = 3; //back naar menu
breken;
}
}
}
breken;
}
geval 4: / / ei timer
int minutemins = 99;
terwijl (1)
{
int buttoncode = buttonpressed (); //so dat het niet hoeft te bemonsteren tweemaal
Als (buttoncode == 0)
breken;
Als (buttoncode == 1)
{
minutemins=SetValue(true);
minutemins = (minuut () + minutemins) %60;//to zorgen het correct zal werken, zelfs als uur verandert terwijl de ei-timer actief is (die is niet echt mogelijk nu als ik erover nadenk...)
playSound(3);
}
Als (minute()==minutemins)
{
playSound(1);
Als (buttoncode == 0)
breken;
}
}
breken;
}
}
}
Tot nader order is de onderstaande code niet de mijne
ongeldig doEncoderA() {}
ontdendering
Als (roterende) vertraging (1); een beetje wachten totdat het stuiteren is gedaan
Testen van de overgang, deed dingen echt veranderen?
Als (digitalRead(encoderPinA)! = A_set) {/ / nogmaals debounce
A_set =! A_set;
teller + als A B leidt aanpassen
Als (A_set & &! B_set)
encoderPos += 1;
roterende = false; niet meer debouncing tot loop weer raakt
}
}
Onderbreken op B staat, net als een bovenstaande wijzigen
ongeldig doEncoderB() {}
Als (roterende) vertraging (1);
Als (digitalRead(encoderPinB)! = B_set) {}
B_set =! B_set;
aanpassen teller - 1 als B A leidt
Als (B_set & &! A_set)
encoderPos-= 1;
roterende = false;
}
}
van nu af aan, is de code de mijne weer
int buttonpressed()
{
Als (analogRead(buttonpin) > 5) //is iets gaan op helemaal?
{
int-returnvalue =-1;
unsigned long beginms = millis (); //variable voor later vergelijking te vertellen voor hoe lang is de knop ingedrukt
while(1)
{
unsigned long lastmillis;
int value=analogRead(buttonpin);
Als (waarde > 5) //should 0 worden, maar sommige hysteresion kan nooit kwaad
{
lastmillis=Millis();
Als (abs(value-((2*R)/3)) < 10) //button 2
returnValue = 0;
anders
Als (abs(value-R) < 10) //button 1
{
returnValue = 1;
R = waarde;
}
anders
Als (abs(value-((2*R)/5)*3) < 10) //both knoppen, niet echt werkt
returnValue = 2;
}
anders
Als (millis ()-lastmillis > 20) //to doen de debouncing; Graaf knop zoals vrijgegeven zodra het is vrijgegeven voor meer dan 20 MS
{
presslength = millis ()-beginms;
retourneren returnvalue;
breken;
}
}
}
anders
retourneren -1;
}
int (int num) beepnumber //beeping uit het nummer. Werkt in principe pseudorecursively door het argument te delen door de cijfers van hoog naar laag
en dan voedt de modulo van divisie terug naar zichzelf en het hele proces herhaalt
{
Als (num == 0)
{
playSound (2), //special code voor nul
keren 0;
}
int initpos = encoderPos;
int numbertypevalue [] {} =
-1, -1, -1 ,-1 };
for (int i = 0; ik < typecount; i ++)
{
Als (num/argument numbertype [i] > = 1)
{
numbertypevalue[i]=Floor(num/NumberType[i]);
num = num % argument numbertype [i];
}
encoderPos = initpos; //basically gebruiker draaien van het coderingsprogramma als piepen de waarde negeren
Als (numbertypevalue [i] > -1)
{
voor (int i2 = 0; i2 < numbertypevalue[i];i2++)
{
voor (int i3 = 0; i3 < 4-i; i3 ++)
{
delay(delaytime/2);
Toon (loudspeakerpin, numbertypesound[i],delaytime);
delay(delaytime);
}
delay(delaytime*2);
}
}
}
}