Miganie na ekranie, czyli Hello World! i nie tylko w języku C

SBC na iMX6 ....
https://somlabs.com/
ODPOWIEDZ
Awatar użytkownika
l3n1n
Moderator
Posty: 195
Rejestracja: 28 paź 2017, 8:46
Lokalizacja: 3M

Miganie na ekranie, czyli Hello World! i nie tylko w języku C

Post autor: l3n1n » 21 lip 2018, 17:57

Zmusiliśmy naszą płytkę do migania diodą z konsoli. Ale w jaki sposób dokonać tego w języku C? Spróbujemy tego dokonać i dodatkowo wyświetlimy komunikat o stanie diody na naszym LCD.

Musimy się zastanowić chwilkę jak działało zmuszenie LEDa do za świecenia a następnie do zgaśnięcia w bashu. Na początku musielismy wyeksportować gpio o interesującym nas numerku. Następnie trzeba było ustawić kierunek, in lub out, direction. A na zakończenie trzeba było przypisać odpowiednią wartość dla value w momencie gdy direction przyjęło wartość out.

Wychodzi na to, że potrzebujemy trzech funkcji:

- pin_export
- pin_direction
- pin_value

W związku z tym, że mamy do czynienia z plikami (export, direction, value) i musimy w nich umieścić odpowiednie wpisy, możemy posłużyć się operacjami na plikach. Ja utworzyłem mini libsa o nazwie piny.h i w nim umieściłem odpowiednie funkcje.

Plik piny.h

Kod: Zaznacz cały

/*
 * piny.h
 *
 *  Created on: 21 lip 2018
 *      Author: l3n1n
 */
#ifndef PINY_C_
#define PINY_C_

#define	LED	10
#define EXPORT	"/sys/class/gpio"
#define IN	0
#define OUT	1

int pin_kierunek (unsigned int pin, unsigned int direction);
int pin_export (unsigned int pin);
int pin_wartosc (unsigned int pin, unsigned int value);



#endif /* PINY_C_ */
Plik piny.c

Kod: Zaznacz cały

/*
 * piny.c
 *
 *  Created on: 21 lip 2018
 *      Author: l3n1n
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#include "piny.h"


int pin_export (unsigned int pin)
{
int fd, dlugosc;
char buf[6];
fd = open (EXPORT "/export", O_WRONLY);
if (fd < 0)
{
perror ("gpio/export");
return fd;
}
dlugosc = snprintf (buf, sizeof(buf), "%d", pin);
write (fd, buf, dlugosc);
close (fd);
return 0;
}

int pin_kierunek (unsigned int pin, unsigned int direction)
{
int fd;
char buf[33];
snprintf (buf, sizeof(buf), EXPORT "/gpio%d/direction", pin);

fd = open (buf, O_WRONLY);
if (fd < 0)
{
perror ("Blad");
return fd;
}
if (direction)
write (fd, "out", sizeof("out"));

else
write (fd, "in", sizeof("in"));

close (fd);

return 0;
}

int pin_wartosc (unsigned int pin, unsigned int value)
{

int fd;
int dl = 33;
char buf[dl];
snprintf (buf, sizeof(buf), EXPORT "/gpio%d/value", pin);
fd = open (buf, O_WRONLY);
if (fd < 0)
{
perror ("gpio/set-value");
return fd;
}
if (value)
write (fd, "1", 2);
else
write (fd, "0", 2);
close (fd);
return 0;
}

Pozostało jeszcze napisać jakiś konkretny plik z funkcją main tak aby to jakoś działało. W zwiazku z tym że posiadam patent na lenistwo, przerobiłem plik z obsługi LCD i dopisałem linijki aby w momencie gdy LED ma zaświecić pojawiał się napis LED ON a gdy ma zgasnąć pojawiał się napis LED OFF.
Pliki nie są doskonałością programistyczną. Bo ani ja nie pretenduje do miana Programisty przez duże "P" ani tez nie mam takiego talentu jak niektórzy koledzy z tego forum, jednak ma on jedna pozytywną cechę: działa :D.

Plik testlcd.c

Kod: Zaznacz cały

#include <stdio.h>
#include <string.h>
#include <linux/fb.h>
#include "lcd.h"
#include <unistd.h>
#include <fcntl.h>

#include "piny.h"


#define I2C_FILE_NAME "/dev/i2c-1"


const char* txt[]  = {
    "l3n1n pozdrawia",
	"Forum Sunduino"
};


int main(){
	char* t_in = { "LED OFF" };
	char* t_out = { "LED ON" };

    int i2c_dev;
    lcd lcd0;
    // 0x3f is the address of the i2c device
    i2c_dev = open_i2c(I2C_FILE_NAME, 0x3f);
    if(i2c_dev <0){
       printf("Blad: %d\n", i2c_dev);
       return 1;
    }
    lcd_init(&lcd0, i2c_dev);
    lcd_clear(&lcd0);
    lcd_print(&lcd0, txt[0], strlen(txt[0]), 0);
    lcd_print(&lcd0, txt[1], strlen(txt[1]), 1);
    sleep(1);

    while(1)
    {
    	lcd_clear(&lcd0);
    	(pin_wartosc(LED,1));
    	lcd_print(&lcd0, t_out, strlen(t_out), 0);
    	sleep(1);
    	lcd_clear(&lcd0);
    	(pin_wartosc(LED,0));
    	lcd_print(&lcd0, t_in, strlen(t_in), 0);
    	sleep(1);


    }
    return 0;
    close_i2c(i2c_dev);
}

A tu umieściłem filmik na dowód, że moje bohomazy działają:[/align]

https://youtu.be/zjUJvKCpJoo

ODPOWIEDZ