Robojuchen / Mechatronics2013

Demo
2 stars 4 forks source link

Samin koodii: onglema LCD-näytön kanssa #47

Open samstream opened 10 years ago

samstream commented 10 years ago

Tässä mun keskeneräistä koodii, mikäköhän pielessä Likvid kristallin kanssa ja siitä ees päin.

int naytto = 6;

int led = 7;

int echoPin = 8; // etaisyysmit

int trigPin = 9; // etaisyysmit

 #include <Servo.h>

Servo lukkoServo; // luodaan servo-objekti nimeltä lukko

 #include <Servo.h>

Servo kansiServo; // luodaan servo-objekti nimeltä kansi

 #include <Servo.h>

 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(lukkoServo, OUTPUT); // lukolle pin 3

pinMode(kansiServo, OUTPUT);// kannelle pin 4

pinMode(tasoServo, OUTPUT); // tasolle pin 5

pinMode(naytto, OUTPUT); // näytölle pin 6

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 keskelle, 90 asteen kulmaan

delay(1000); // servolle pitää antaa aikaa liikkua

}

 {

kansiServo.attach(4); //käynnistää kansi nimisen servo-objektin pinnissä 4

kansiServo.write(90); // asettaa servon keskelle, 90 asteen kulmaan

delay(1000); // servolle pitää antaa aikaa liikkua

}

 {

tasoServo.attach(5); //käynnistää taso nimisen servo-objektin pinnissä 5

tasoServo.write(90); // asettaa servon keskelle, 90 asteen kulmaan

delay(1000); // servolle pitää antaa aikaa liikkua

}

{

lcd.init(); // Alustaa näytön toimivaksi.

// Sitten taustavalo päälle ja tulostetaan.

lcd.backlight();

lcd.print("Hello, world!");

}

}

void loop() 

if(arvo<????)
{

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(arvo<?????)
{

lukkoServo.write(0); // käskee servon toiseen äärilaitaan, 0-asteen kulmaan

delay(1000);

lukkoServo.write(180); // käskee servon vastakkaiseen äärilaitaan, 180 asteen kulmaan

delay(1000);

lukkoServo.write(90); // takaisin keskelle ja odotellaan 5 sekuntia

delay(5000);

}

if(arvo<???)
{

kansiServo.write(0); // käskee servon toiseen äärilaitaan, 0-asteen kulmaan

delay(1000);

kansiServo.write(180); // käskee servon vastakkaiseen äärilaitaan, 180 asteen kulmaan

delay(1000);

kansiServo.write(90); // takaisin keskelle ja odotellaan 5 sekuntia

delay(5000);

}

if(arvo<????)
{

tasoServo.write(0); // käskee servon toiseen äärilaitaan, 0-asteen kulmaan

delay(1000);

tasoServo.write(180); // käskee servon vastakkaiseen äärilaitaan, 180 asteen kulmaan

delay(1000);

tasoServo.write(90); // takaisin keskelle ja odotellaan 5 sekuntia

delay(5000);

}

if(arvo<????)
{

delay(1000);

lcd.print("Hello My Love"); // Uusi teksti tulostuu aina entisen päälle.

delay(1000);

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;

}
Robojuchen commented 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.

  1. Setup-osiossa on turhia sulkeita osien ymärillä, kaikki komennot voi kirjoittaa putkeen. Katso malleja.
samstream commented 10 years ago

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;

}
Robojuchen commented 10 years ago

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.