sobota, 21 kwietnia 2018

Lazy Robot V1 - Część 3/8 - Serwomechanizm

Obsługa serwomechanizmu na którym obraca się czujnik ultra-dźwiękowy.

UWAGA!
Po wgraniu kodu servo zacznie się obracać.


















Kod źródłowy:
/*                      Download from Lazy Admin Blog                        */
/* Blog URL:     https://lazyadminblog.blogspot.com                          */
/* Mail:         lazychannelandblog@gmail.com                                */
/* YouTube:      https://www.youtube.com/channel/UC8DB_NVekpEIuG-SAvpXOWQ    */
/* GitHub:       https://github.com/LazyAdminBlog                            */

#include <Servo.h>      /* Attach library for using SERVO */

#define SERVO_1_PIN 8   /* Set pin 8 as SERVO pin   */

Servo SERVO_1;          /* Create a Servo type structure */

void setup()
{
  SERVO_1.attach(SERVO_1_PIN);  /* Set pin for SERVO_1      */
  SERVO_1.write(90);            /* Set 90 degree SERVO_1 (forward state). */
}

void loop()
{
  delay(2000);          /* Wait two second */
  SERVO_1.write(180);   /* Set 180 degree */
  delay(2000);          /* Wait two second */
  SERVO_1.write(90);    /* Set 90 degree */
  delay(2000);          /* Wait two second */
  SERVO_1.write(0);     /* Set 0 degree  */
  delay(2000);          /* Wait two second */
  SERVO_1.write(90);    /* Set 90 degree */
}

Lazy Robot V1 - Część 2/8 - Czujnik temperatury i wilgotności DHT-11


Posiada 16-bitową rozdzielczość, zalecany zakres temperatur od 10°C do 40°C oraz wigotność poniżej 60% RH. Wymaga napięcia zasilania 3,5~5,5 V. Czujnik posiada cztery wyprowadzenia, lecz wykorzystujemy tylko trzy, końcówka NC zostaje niepodłączona. W celach testowych do zasilania czujnika wystarczy zasilanie z portu USB, choć można korzystać także z baterii. Do podłączenia czujnika wymagany jest rezystor 10 kΩ (kOhm).
Zdjęcia czujnika:





Podłączenie do modułu:

























Kod źródłowy:
/*                      Download from Lazy Admin Blog                        */
/* Blog URL:     https://lazyadminblog.blogspot.com                          */
/* Mail:         lazychannelandblog@gmail.com                                */
/* YouTube:      https://www.youtube.com/channel/UC8DB_NVekpEIuG-SAvpXOWQ    */
/* GitHub:       https://github.com/LazyAdminBlog                            */

#include "DHT.h" /*Include (add to sketch) DHT.h library for DHT sensor*/

#define DTH_SENSOR_PIN 9  /*Set witch pin connect to DHT11 sensor*/
#define DHTTYPE DHT11     /*Set sensor type (model): DHT11*/

DHT dht(DTH_SENSOR_PIN, DHTTYPE);

void setup()
{
  Serial.begin(9600);                /*Initial serio port (COM) for arduino.*/
  Serial.println("DHT11 test!");     /*Write initial success test/*/
  dht.begin();                       /*Initial dht sensor.*/
}

void loop()
{
  delay(2000); /*Wait a few seconds between measurements.*/
  
  float h = dht.readHumidity();         /*Read humidity from sensor*/
  float t = dht.readTemperature();      /*Read temperature as Celsius (the default)*/
  float f = dht.readTemperature(true);  /*Read temperature as Fahrenheit (isFahrenheit = true)*/
  
  /* Check if any reads failed and exit early (to try again).*/
  if (isnan(h) || isnan(t) || isnan(f))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  float hif = dht.computeHeatIndex(f, h);         /* Compute heat index in Fahrenheit (the default)*/
  float hic = dht.computeHeatIndex(t, h, false);  /* Compute heat index in Celsius (isFahreheit = false) */

  /*Start show read value on serial port.*/
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" °C ");
  Serial.print(f);
  Serial.print(" °F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" °C ");
  Serial.print(hif);
  Serial.println(" °F");
  /*End of show data.*/
}


Na porcie szeregowym arduino otrzymujemy odczyt temperatury i wilgotności jeżeli wszystko zostało podłączone poprawnie.
(aby uruchomić naciśnij CTRL + SHIFT + M w środowisku arduino)
















Kod na GitHub'ie:
https://github.com/LazyAdminBlog/LazyRobotV1/tree/master/Part%202%20-%20DHT-11%20temperature%20and%20humidity%20sensor

Dodatkowo potrzebna jest biblioteka AdaFruit. Znajduje się ona na moim GitHubie lecz kod źródłowy podchodzi z:
https://github.com/adafruit/DHT-sensor-library
Specyfikacja techniczna (DataSheet):
https://akizukidenshi.com/download/ds/aosong/DHT11.pdf

środa, 21 marca 2018

00035 - 617 - StringMerge - www.pl.spoj.com

Treść zadania:

Napisz funkcję:

char* string_merge(char *, char *);


która sklei ze sobą dwa łańcuchy biorąc na przemian po jednym znaku z każdego łańcucha i umieści w nowej dynamicznie alokowanej tablicy znaków, do której zwróci wskaźnik. Należy wziąć po tyle znaków ile jest w krótszym łańcuchu.

Input
W pierwszej linii liczba testów t, w kolejnych liniach po dwa łańcuchy znaków odzielone spacją.

Output
W każdej linii jeden łańcuch, wynik działania funkcji string_merge.

Example

Input:
4
a bb
abs sfd
ewr w
wqeqweqweq eqweqwe

Output:
ab
asbfsd
ew
weqqewqewqewqe


Kod źródłowy w C++:
#include <iostream>
#include <cstring>

#define T_SIZE 1001

using namespace std;

char* string_merge(char *a, char *b)
{
    int i, c;
    i=0;
    c=0;
    char *s = new char [10000];
    while(a[i] != '\0' && b[i] !=  '\0')
    {
        s[c]=a[i];
        ++c;
        s[c]=b[i];
        ++c;
        ++i;
    }
    s[c]='\0';
    return s;
};

int main()
{
    int t, n;
    char S1[T_SIZE], S2[T_SIZE], *S;
    cin >> t; /* wczytaj liczbę testów */
    cin.getline(S1,T_SIZE);
    while(t)
    {
        cin.getline(S1,T_SIZE,' ');
        cin.getline(S2,T_SIZE);
        S=string_merge(S1,S2);
        cout << S << endl;
        delete[] S;
        t--;
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/PP0504B/

poniedziałek, 19 marca 2018

00034 - 1300 - Szyfr Cezara - www.pl.spoj.com

Treść zadania:

Szyfr Cezara jest to szyfr za pomocą, którego Juliusz Cezar szyfrował swoje listy do Cycerona. Jako ciekawostkę można podać, że szyfr ten był podobno używany jeszcze w 1915 roku w armii rosyjskiej, gdyż tylko tak prosty szyfr wydawał się zrozumiały dla sztabowców.

Każdą literę tekstu jawnego zamieniamy na literę przesuniętą o 3 miejsca w prawo. I tak literę A szyfrujemy jako literę D, literę B jako E itd. W przypadku litery Z wybieramy literę C. W celu odszyfrowania tekstu powtarzamy operację tym razem przesuwając litery o 3 pozycje w lewo.

Input
Na wejściu pojawi się tekst zawierający jedynie wielkie litery alfabetu łacińskiego, spacje oraz znaki nowej linii, a jego długość nie przekracza 200 znaków.

Output
Na wyjściu otrzymujemy zaszyfrowany tekst używając Szyfru Cezara.

Example

Input:
ABC DEF
TERA EST ROTUNDA

Output:
DEF GHI
WHUD HVW URWXQGD


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char c;
    for(;scanf("%c",&c)==1;)
    {
        if(c<='Z' && c>='A')
        {
            if(c>'W')
            {
                printf("%c",c-23);
            }
            else
            {
                printf("%c",c+3);
            }
        }
        else
        {
            printf("%c",c);
        }
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    char c;
    for(;scanf("%c",&c)==1;)
    {
        if(c<='Z' && c>='A')
        {
            if(c>'W')
            {
                printf("%c",c-23);
            }
            else
            {
                printf("%c",c+3);
            }
        }
        else
        {
            printf("%c",c);
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/JSZYCER/

środa, 14 marca 2018

00033 - 1910 - Odwracanie wyrazów - www.pl.spoj.com

Treść zadania:

Napisz program, który zapisuje wspak podane na wejściu wyrazy.

Wejście
Na wejście programu podana zostanie pewna nieokreślona ilość wyrazów, tj. ciągów znaków zbudowanych z małych liter. Poszczególne wyrazy zostaną rozdzielone znakiem nowej linii. Przyjmujemy, że długość wyrazów nie przekracza 1000 znaków.

Wyjście
Na wyjściu mają się pojawić te same wyrazy, które pojawiły się na wejściu, ale zapisane wspak. Poszczególne wyrazy należy rozdzielić znakiem nowej linii.

Przykład

Wejście:
alfa
beta
gamma

Wyjście:
afla
ateb
ammag


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int i;
    char input[1000];
    for(;cin>>input;)
    {
        for(i=0;input[i]!='\0';++i)
        {

        }
        --i;
        for(i;i!=-1;--i)
        {
            cout<<input[i];
        }
        cout<<endl;
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/KC009/

poniedziałek, 12 marca 2018

00032 - 4138 - Harry and big doughnuts - www.pl.spoj.com

Treść zadania:

Młody Harry został poproszony o kupienie karmy dla kotów przez swoją sąsiadkę - starą, dziwną panią, która była właścicielką wielu kotów. Ale koty też były dziwne i jadały tylko pączki. Toteż sąsiadka chciała aby Harry przyniósł jej dokładnie po jednym pączku dla każdego kota - a posiadała ich c. Harry miał ze sobą plecak, ale że był tylko małym chłopcem, potrafił udźwignąć jedynie k kilogramów. Harry wiedział, że każdy pączek waży w kilogramów (duże koty, duże pączki). Pomóż Harremu zdecydować czy powinien iść do supermarketu i kupić żarcie, czy się po prostu poddać i pomarzyć o odrobinie magii...

Wejście
W pierwszej linii jedna dodatnia liczba całkowita t (t <= 100) oznaczająca ilość testów (Harry został poproszony o kupno pączków kilka razy). Następnie t linii, każda zawierająca 3 liczby: c, k oraz w (1 <= c, k, w <= 100)

t [liczba testów]
c k w [liczba kotów, udźwig Harrego oraz waga pączka]
c k w [następny test]
...

Wyjście
t linii zawierających słowo "yes" jeśli Harry jest w stanie wykonać zadanie lub "no" jeśli pączki złamałyby Harremu kręgosłup.

Przykład

Wejście:
3
5 15 3
1 5 4
13 25 2

Wyjście:
yes
yes
no


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t, c, k, w, i;
    scanf("%d",&t);
    for(i=0;i<t;++i)
    {
        scanf("%d%d%d",&c,&k,&w);
        if((w*c)<=k)
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int t, c, k, w;
    cin>>t;
    for(int i=0;i<t;++i)
    {
        cin>>c>>k>>w;
        if((w*c)<=k)
        {
            cout<<"yes"<<endl;
        }
        else
        {
            cout<<"no"<<endl;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/DOUGHNUT/

środa, 7 marca 2018

00031 - 1042 - Test 3 - www.pl.spoj.com

Treść zadania:

Przepisz dane z wejścia na wyjście. Dane wejściowe są dwucyfrowymi liczbami naturalnymi. Zakończ działanie programu, gdy na wejściu pojawi się, trzecia liczba 42 poprzedzona jakąkolwiek inną liczbą, różną od 42.

Wejście
W każdej linii jedna liczba dwucyfrowa.

Wyjście
W każdej linii jedna liczba dwucyfrowa. Odczytane wartości 42 również powinny się pojawić.

Przykład

Wejście:
42
42
12
13
42
11
42
43
42
42
99
01

Wyjście:
42
42
12
13
42
11
42
43
42


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a, b, c=0;
    scanf("%d",&b);
    printf("%d\n",b);
    for(;;)
    {
        scanf("%d",&a);
        if(a==42 && b != 42)
        {
            ++c;
        }
        printf("%d\n",a);
        b=a;
        if(c==3)
        {
            break;
        }
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int a, b, c=0;
    cin>>b;
    cout<<b<<endl;
    for(;;)
    {
        cin>>a;
        if(a==42 && b != 42)
        {
            ++c;
        }
        cout<<a<<endl;
        b=a;
        if(c==3)
        {
            break;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/PP0601A2/