Измерване на температура с
RASPBERRY PI
Една от основните характеристики на средата, в която живеем е температурата и поради тази причина измерването и е доста важно.
Един от най-лесните методи за това измерване е използването на 1-Wire датчици на Maxim integrated.
Схемата за измерване е:
По този начин могат да се свържат до 10 датчика към 1 преобразувател от 1-Wire към I2C DS2482.
Подкарва се по следният начин:
1. Променя се файла "arch/arm/mach-bcm2708/bcm2708.c" от сорсовете на кърнела, така че той да съдържа следния код:
static struct platform_device bcm2708_bsc1_device = {
.name = "bcm2708_i2c",
.id = 1,
.num_resources = ARRAY_SIZE(bcm2708_bsc1_resources),
.resource = bcm2708_bsc1_resources,
};
static struct i2c_board_info __initdata pi_i2c_devs[] = {
{
I2C_BOARD_INFO("ds1307", 0x68),
I2C_BOARD_INFO("ds2482", 0x18),
},
};
......
bcm_register_device(&bcm2835_thermal_device);
i2c_register_board_info(1, pi_i2c_devs,ARRAY_SIZE(pi_i2c_devs));
2. Избират се следните модули
ARCH=arm CROSS_COMPILE=${CCPREFIX} make menuconfig
3. Променя се функцията static void w1_post_write(struct w1_master *dev) във файла drivers/w1/w1_io.c така, че да съдържа:
static void w1_post_write(struct w1_master *dev)
{
if (dev->pullup_duration) {
if (dev->enable_pullup && dev->bus_master->set_pullup){
dev->bus_master->set_pullup(dev->bus_master->data, 0);
msleep(dev->pullup_duration);
else{
msleep(dev->pullup_duration);
}
dev->pullup_duration = 0;
}
}
4. Във файла drivers/w1/masters/ds2842.c се добавя функцията static u8 ds2482_w1_set_pullup(void *data, int delay)
static u8 ds2482_w1_set_pullup(void *data, int delay)
{
struct ds2482_w1_chan *pchan = data;
struct ds2482_data *pdev = pchan->pdev;
u8 retval = 1;
u8 cfg;
/* if delay is non-zero activate the pullup,
* the strong pullup will be automatically deactivated
* by the master, so do not explicitly deactive it
*/
if (delay) {
/* both waits are crucial, otherwise devices might not be
* powered long enough, causing e.g. a w1_therm sensor to
* provide wrong conversion results
*/
ds2482_wait_1wire_idle(pdev);
/* note: it seems like both SPU and APU have to be set! */
retval = ds2482_send_cmd_data(pdev, DS2482_CMD_WRITE_CONFIG,
ds2482_calculate_config(DS2482_REG_CFG_SPU | DS2482_REG_CFG_APU));
ds2482_wait_1wire_idle(pdev);
}
return retval;
}
5. Във файла drivers/w1/masters/ds2842.c се променя функцията static int ds2482_probe(struct i2c_client *client, const struct i2c_device_id *id), така че да съдържа:
/* Register 1-wire interface(s) */
for (idx = 0; idx < data->w1_count; idx++) {
data->w1_ch[idx].pdev = data;
data->w1_ch[idx].channel = idx;
/* Populate all the w1 bus master stuff */
data->w1_ch[idx].w1_bm.data = &data->w1_ch[idx];
data->w1_ch[idx].w1_bm.read_byte = ds2482_w1_read_byte;
data->w1_ch[idx].w1_bm.write_byte = ds2482_w1_write_byte;
data->w1_ch[idx].w1_bm.touch_bit = ds2482_w1_touch_bit;
data->w1_ch[idx].w1_bm.triplet = ds2482_w1_triplet;
data->w1_ch[idx].w1_bm.reset_bus = ds2482_w1_reset_bus;
data->w1_ch[idx].w1_bm.set_pullup = ds2482_w1_set_pullup;
err = w1_add_master_device(&data->w1_ch[idx].w1_bm);
if (err) {
data->w1_ch[idx].pdev = NULL;
goto exit_w1_remove;
}
}
Ако тези промяни не се направи не може да се използва функцията STRONG PULLUP.
6. Кърнела се компилира по подобие на инструкциите описани тук
7. Зареждат се следните модули:
# modprobe i2c-bcm2708
# modprobe w1-therm
# modprobe ds2482
Ако всичко е наред във директорията /sys/devices/w1_bus_master1 се появяват вчики 1-Wire устройства, които са открити от DS2482.
root@raspberrypi:/sys/bus/w1/devices# ls -la
total 0
drwxr-xr-x 2 root root 0 May 11 09:15 .
drwxr-xr-x 4 root root 0 May 11 09:15 ..
drwxr-xr-x 3 root root 0 May 11 11:11 28-00000311c0b4
drwxr-xr-x 3 root root 0 May 11 11:11 28-00000311df82
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bf443d
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bf58a1
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bf7a99
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bf82b6
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bf89ee
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bfd9ec
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004bff7c5
drwxr-xr-x 3 root root 0 May 11 11:11 28-000004c06982
lrwxrwxrwx 1 root root 0 May 11 11:27 driver -> ../../bus/w1/drivers/w1_master_driver
drwxr-xr-x 2 root root 0 May 11 11:27 power
lrwxrwxrwx 1 root root 0 May 11 11:11 subsystem -> ../../bus/w1
-rw-r--r-- 1 root root 4096 May 11 11:11 uevent
-rw-rw-r-- 1 root root 4096 May 11 11:12 w1_master_add
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_attempts
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_max_slave_count
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_name
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_pointer
-rw-rw-r-- 1 root root 4096 May 11 11:12
-rw-rw-r-- 1 root root 4096 May 11 11:12 w1_master_remove
-rw-rw-r-- 1 root root 4096 May 11 11:12 w1_master_search
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_slave_count
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_slaves
-r--r--r-- 1 root root 4096 May 11 11:12 w1_master_timeout
root@raspberrypi:/sys/devices/w1_bus_master1#
Съдържанието на файла /sys/devices/w1_bus_master1/w1_master_pullup определя дали ще се използва STRONG PULLUP или не.
Разрешава се чрез:
echo 1 > /sys/devices/w1_bus_master1/w1_master_pullup
и се забранява чрез
echo 0 > /sys/devices/w1_bus_master1/w1_master_pullup
Простичък скрипт за показване на температурата на всичк датчици:
#!/bin/bash
dir=`ls /sys/bus/w1/devices | grep 28-`
while [ 1 ]; do
for x in $dir
do
str=`cat "/sys/bus/w1/devices/$x/w1_slave"`
temper=${str:${#str} -5}
a=${temper:0:${#temper} -3}
b=${temper:${#temper} -3}
echo "$x => $a.$b"
done
echo ""
done
... и резултата от него:
./t.sh
28-00000311c0b4 => 23.625
28-00000311df82 => 24.875
28-000004bf443d => 22.875
28-000004bf58a1 => 23.937
28-000004bf7a99 => 22.562
28-000004bf82b6 => 23.062
28-000004bf89ee => 22.937
28-000004bfd9ec => 23.125
28-000004bff7c5 => 23.625
28-000004c06982 => 22.875
28-00000311c0b4 => 23.625
28-00000311df82 => 24.937
28-000004bf443d => 22.875
Коментари:
Нов коментар