Positive SSL

Измерване на температура с
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

Коментари:

Нов коментар

Вашето име: