Cheese making
In parallel with the synthetic biology work, we are experimenting with cheeses made from powdered purified casein, and using vegan oils to replace milkfat. This page documents our cheese-making efforts.
Electric cheese cave
Most hard cheeses that are the least bit interesting need to be aged at colder than room temperature and high humidity. We've built a wifi-enabled cheese cave out of modified wine chiller.
The cheese cave is based around a "Haier 18-Bottle Thermal Electric Wine Tower" that we found for $40 on craigslist. This is an upright wine chiller that uses two large peltier modules with heatsinks and fans to chill the bottles.
Arduino and sensor
The temperature and humidity are read every second using a 3.3 volt Arduino Pro and a SHT15 sensor breakout board from Sparkfun.
The arduino is powered by 3.3v coming from the wifi router and communicates with the router using TTL serial.
The sensor communicates with the Arduino using 2-wire.
Wifi router
A Linksys/Cisco WRT160NL router was flashed with OpenWRT version 12.09 Attitude Adjustment. OpenWRT was configured to use an external usb flash drive as its root partition (extroot). Avahi was installed and the hostname set to cheese, such that any mDNS compatible operating systems are able to access the router through the domain name cheese.local.
A simple web server was written in lua to read the temperature and humidity from the Arduino and display it on a web page such that the status of the cheese cave can be monitored by accessing http://cheese.local in a web browser.
Physical modifications
The wine shelves were cut to make them flatter and a sushi mats was places on each shelf.
Wires were run into the chiller by un-mounting the bottom peltier module, cutting a small amount of insulation away, running the wire through and re-mounting the peltier module. One 110 vac power cord was run for the humidifier and a communications cord was run for the temperature/humidity sensor.
ToDo
- Allow changing humidity set-point from the web app
- Allow changing temperature set-point from the web app
- Write step-by-step guide for replicating the electric cheese cave
OpenWRT configuration
The following assumes some knowledge of networks and *nix command line.
Go to the OpenWRT table of hardware and find the wiki page for your router. It will tell you how to flash it with OpenWRT. You should use a wifi router that has the following minimum specs:
- Atheros chipset
- 32 MB ram
- 4 MB flash
- USB
- Supported by OpenWRT
After flashing, telnet into the router using:
telnet 192.168.1.1
Set the root password:
passwd
Now exit the telnet session and log in with ssh instead:
ssh root@192.168.1.1
Wifi setup
We'll set up the router to connect to your existing wifi access point as a client (you could also connect it using wired ethernet if you prefer, which should not require any configuration, provided your router has a wan port).
Edit the "config wifi-iface" section in /etc/config/wireless (using vi) too look like this:
config wifi-iface option device radio0 option ifname wlan0 option network wifi option mode sta option ssid myaccesspoint option encryption none
Replacing myaccesspoint with your wifi access point name. If the access point is password protected you will have to specify the encryption method and password.
In the same file, remove the following line:
option disabled 1
Now edit /etc/config/network, adding the following section to the end of the file:
config interface 'wifi' option ifname 'wlan0' option proto 'dhcp'
If you're planning on using the router on a network that uses 192.168.1.x IP addresses, then you should change the line "option ipaddr '192.168.1.1'" to e.g:
option ipaddr '192.168.2.1'
If you change this, then you'll have to use this new ip addr connecting to your node with ssh in the future.
Now reboot the router. When it finishes booting, ssh back into it and check if the internet is working:
ping sudomesh.org
USB extroot
Now you can set up extroot to use a flash drive as your root partition. Take a usb flash drive, and plug it into a normal linux system (e.g. debian). It should show up as e.g. /dev/sdb (you can check using dmesg). First unmount it in case it's mounted:
sudo umount /dev/sdb1
Now change the flash disk partition type to linux:
sudo fdisk /dev/sdb
At the fdisk menu, hit: t <enter> 83 <enter> w <enter> ctrl+c
Format the flash drive as ext4:
sudo mkfs.ext4 /dev/sdb1
Now plug the usb flash drive into your router and ssh into the router. The rest of the commands in this section take place on your router.
Install the required packages for extroot:
opkg update opkg install blkid block-mount kmod-fs-ext4 kmod-lib-crc16kmod-nls-base kmod-scsi-core kmod-usb-core kmod-usb ohci kmod-usb-storage libblkid libuuid swap-utils
Change the section "config mount" in /etc/config/fstab to look like this:
config mount option target / option device /dev/sda1 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0
Now mount the usb drive and copy the filesystem:
mkdir /tmp/mnt mount /dev/sda1 /tmp/mnt cd / cp -a bin etc lib rom root sbin usr var www /tmp/mnt/ cd /tmp/mnt mkdir dev mnt overlay proc sys tmp sync cd / umount /tmp/mnt
If the following command gives any output after rebooting, then you are now using extroot:
mount | grep sda1
Avahi (mDNS)
To set up mDNS, first install avahi-daemon:
opkg update opkg install avahi-daemon
Make it work without d-bus by adding this line to the [server] section of /etc/avahi/avahi-daemon.conf:
enable-dbus=no
Make it auto-start on boot:
/etc/init.d/avahi-daemon enable
Change your hostname to something relevant by editing the hostname option in /etc/config/system (maybe set it to cheese so you can use cheese.local to access the cheese cave).
Start avahi:
/etc/init.d/avahi-daemon start
Wiring notes
Communications cables between sensor, router and arduino take place over old PS/2 cables that have been cut and soldered onto the different devices. These cables are shielded, easy to get for free, and the plugs make it easy to disconnect and reconnect components.
From router:
- RX: Brown
- TX: Orange
- 3.3v: Green
- GND: Ground (shield)