Open samstream opened 10 years ago
Siinä hyvä alku koodille, hyvä! Muutama juttu. Päivitätkö tuohon sun projektiin mitä laitteita käytät jne kuten ohjeissa oli. Helpottaa mm. tämän ongelman selvittämistä. Sitten tähän ongelmaan pitäisi liittää tieto siitä mitä koodin pitäisi tehdä, ja miten se toimii väärin.
Jos Lcd-näyttö ei lähde ollenkaan pelittämään, niin osoite 0x20 voi olla väärä. Alla oleva koodi skannaa arduinossa olevat i2c laitteet ja tulostaa osoitteen sarjaporttiiin.
// --------------------------------------
// i2c_scanner
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
Koodista muutama huomio: 1.Yksi kirjasto ladataan vain kerran. Sitten voi luoda monta objektia niin kuin olet tehnytkin. 2.Voit asettaa esim. setupissa monelle servolle asennon ja pitää sitten sekunnin tauon. servot liikkuvat yhtä aikaa. 3.Servopinnejä ei tarvitse laittaa outputiksi 4.mikä tuo näyttöpinni on? 5.Nyt tuo teksti ei tulostu edellisen päälle niin kuin on tarkoitus vaan perään. Aseta kursori haluttuun kohtaan ennen tulostusta.
Moi, Tässä tietoa hankkeesta ja supistettu koodi. En oo vielä tehnyt kytkentöjä koska ajattelin että koodi pitäisi saada ns. toimivaksi ensin arduinossa l. (ei vikailmoituksia). JA SE ONNISTUI.
arduino nano aivoiksi etäisyys sensori aktivoimaan laatikon toiminnan
pieni servo lukitus salvaksi iso servo nostamaan laatikon kansi keskikok. servo nostamaan sormustaso laatikon auettua lcd näyttö viestiä varten "will you marry me"
lisäksi tilattuna yksi pieni servo varalle.
suomesta piuhat, paristo/akku/kotelo ja ledit valaistusta varten.
Tässä koodi jonka sain toimimaan arduinossa
int led = 7;
int echoPin = 8; // etaisyysmit
int trigPin = 9; // etaisyysmit
long kesto = 0;
long matka = 0;
#include <Servo.h>
Servo lukkoServo; // luodaan servo-objekti nimeltä lukko
Servo kansiServo; // luodaan servo-objekti nimeltä kansi
Servo tasoServo; // luodaan servo-objekti nimeltä taso
#include <Wire.h> // Tämä tuo I2C-kirjaston käyttöön.
#include <LiquidCrystal_I2C.h> // Ja tämä LCD-kirjaston.
LiquidCrystal_I2C lcd(0x20,16,2); // Asettaa LCD näytön osoitteeksi 0x20, näytön koko 16x2 merkkiä.
void setup()
{
pinMode(led, OUTPUT); // ledille pin 7
Serial.begin (9600); //etaisyysmittari
pinMode(trigPin, OUTPUT); // etaisyysmittarin trigille pin 8
pinMode(echoPin, INPUT); // etaisyysmittarin echolle pin 9
lukkoServo.attach(3); //käynnistää lukko nimisen servo-objektin pinnissä 3
lukkoServo.write(90); // asettaa servon vaadittuun asentoon, X asteen kulmaan
kansiServo.attach(4); //käynnistää kansi nimisen servo-objektin pinnissä 4
kansiServo.write(90); // asettaa servon vaadittuun asentoon, X asteen kulmaan
tasoServo.attach(5); //käynnistää taso nimisen servo-objektin pinnissä 5
tasoServo.write(90); // asettaa servon vaadittuun asentoon, X asteen kulmaan
delay(1000); // servoille pitää antaa aikaa liikkua
lcd.init(); // Alustaa näytön toimivaksi.
}
void loop()
{
if(matka<500)//etäisyys laatikosta esim. 2 metriä led syttyy valaisemaan laatikkoa
{
digitalWrite(led, HIGH); // Kytkee jännitteen 5v pinniin 2 ja sytyttää siis ledin.
delay(1000); // ohjelma odottaa 1000 millisekunttia eli sekunnin.
digitalWrite(led, LOW); // Kytkee pinniin jännitteen 0v, ledi sammuu.
delay(1000); // odottelee jälleen sekunnin
}
if(matka<200) //etäisyys esim. 1 m. servo avaa lukon
{
lukkoServo.write(0); // käskee servon X-asteen kulmaan eli lukko aukeaa
delay(5000); //lukkoservo liikkuu
kansiServo.write(0); // käskee servon X-asteen kulmaan eli kansi aukeaa
delay(5000);//kansiservo liikkuu
tasoServo.write(0); // käskee servon X-asteen kulmaan eli taso nousee
delay(5000);//taso nousee
lcd.backlight();//näytön taustavalo päälle
lcd.print("Hello My Love"); // Uusi teksti tulostuu aina entisen päälle.
delay(5000);
lcd.print("Will You Marrie Me");
}
{
etaisyys();
Serial.println(matka);
delay(50);
}
}
void etaisyys()
{
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
kesto = pulseIn(echoPin, HIGH);
matka = kesto/58.2;
return;
}
Hyvältä alkaa näyttää koodi. Tuo etäisyyden mittaus kannattaa tehdä loopin alussa että tietää mitä tehdä riippuen etäisyydestä, sen ympärillä on vielä yhdet turhat sulkeet. Nyt vain sitten hieromaan ja miettimään mitä laitteen haluaa tarkalleen tekevän ja kokeilemaan koodia käytäntöön.
Tässä mun keskeneräistä koodii, mikäköhän pielessä Likvid kristallin kanssa ja siitä ees päin.
{
}