boonC Ответов: 3

Как создать простой GTK показывает значение считывания датчика DS18B20 rasberry pi


привет, ребята, я пользователь программирования на языке Си. у меня есть проект с использованием raspberry Pi. у меня есть датчик температуры ds18b20 и его код, я могу показать его значение считывания в uxterm или терминале. недавно я сделал простой gtk (gui), который не имеет ни одной кнопки или какой-либо панели инструментов. я могу только сделать метку, которая не подключается к значению считывания датчика. как мне объединить этот код, чтобы создать gtk (gui), способный отображать значение считывания датчика температуры и способный постоянно обновлять его показания в любую секунду при изменении температуры? проект-это только программирование на языке Си, а не на другом языке. ниже приведены следующие коды

/*dsb18b20 sensor c-language*/

#include <wiringPi.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

#define		BUFSIZE		128

typedef unsigned char uchar;
typedef unsigned int  uint;

float tempRead(void)
{
	float temp;
	int i, j;
    int fd;
	int ret;

	char buf[BUFSIZE];
	char tempBuf[5];
	
	fd = open("/sys/bus/w1/devices/28-0314979400b5/w1_slave", O_RDONLY);

	if(-1 == fd){
		perror("open device file error");
		return 1;
	}

	while(1){
		ret = read(fd, buf, BUFSIZE);
		if(0 == ret){
			break;	
		}
		if(-1 == ret){
			if(errno == EINTR){
				continue;	
			}
			perror("read()");
			close(fd);
			return 1;
		}
	}

	for(i=0;i<sizeof(buf);i++){
		if(buf[i] == 't'){
			for(j=0;j<sizeof(tempBuf);j++){
				tempBuf[j] = buf[i+2+j]; 	
			}
		}	
	}

	temp = (float)atoi(tempBuf) / 1000;

	close(fd);

	return temp;
}

int main(void)
{
	if(wiringPiSetup() == -1){
		printf("setup wiringPi failed !");
		return 1; 
	}
    float temp;
    while(1){
		temp = tempRead();
		printf("Current temperature : %0.3f\n", temp);
    }
    return 0;

}


/*simple gtk c-language*/


#include <gtk/gtk.h>

void main(int argc, char *argv[])
{
   gtk_init (&argc, &argv);
   GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);

   gtk_window_set_default_size(GTK_WINDOW(win), 250, 150);

   GtkWidget *lbl = gtk_label_new ("100 C");
   gtk_container_add (GTK_CONTAINER (win), lbl);

   gtk_widget_show_all (win);

   gtk_main();

}



я пытаюсь заменить этикетку "100 C" живым показанием датчика. моя ГТК состоянии показывает показания датчиков. кто-нибудь может мне помочь?

Что я уже пробовал:

я все еще начинаю изучать c-Программирование, но понятия не имею, как совместить эти 2 кода.

3 Ответов

Рейтинг:
2

CPallini

Взгляните на эту страницу Обновление асинхронный интерфейс на GTK[^], видеть gdk_threads_add_timeout пример.

Примечание Вы можете использовать sprintf[^] (точно так же, как вы использовали printf) установить буфер, который, в свою очередь, будет использоваться для обновления метки.


Рейтинг:
0

markkuk

Вы можете изменить содержимое метки с помощью gtk_label_set_text()[^] функция и настройка функции обратного вызова, которая вызывается каждую секунду с помощью g_timeout_add_seconds()[^]. Ваша функция обратного вызова должна считывать температуру с помощью tempRead() функция из первого примера кода отформатируйте значение float в строку с помощью snprintf() и установите ярлык.


Рейтинг:
0

Richard MacCutchan

В вашем основном цикле программы вы должны пробовать температуру через фиксированные интервалы времени или использовать какой-то обработчик событий для фиксации изменений. Всякий раз, когда фиксируется новое значение температуры, вы передаете его функции GTK для обновления дисплея.


boonC

я имею в виду, что датчик уже подключен к raspberry pi, когда я открою созданный gtk, он покажет значение температуры, и его значение будет автоматически обновляться в секунду в соответствии с датчиком обнаружения.

Richard MacCutchan

Да, но вам нужно захватить данные с датчика, преобразовать их в некоторую читаемую текстовую строку и передать ее в функцию GTK для отображения.

boonC

могу ли я спросить, если printf показывает переменное значение чтения, можно ли перенести чтение printf внутрь gtk, как я компилирую код с помощью языка c?

Richard MacCutchan

Извините, я не знаю GTK, но я предполагаю, что вы просто добавляете функцию GTK в свою основную программу и вызываете ее из своего основного метода.