Skip to content

Instantly share code, notes, and snippets.

@izumogeiger
Last active December 19, 2016 00:57
Show Gist options
  • Save izumogeiger/6560000 to your computer and use it in GitHub Desktop.
Save izumogeiger/6560000 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <sys/ioctl.h>
static void
HMC5883L_write(
unsigned char address,
unsigned char data,
int fd)
{
unsigned char buf[2];
buf[0] = address;
buf[1] = data;
if((write(fd,buf,2))!=2) {
printf("Error writing to i2c slave\n");
exit(1);
}
return;
}
static unsigned char
HMC5883L_read(
unsigned char address,
int fd)
{
unsigned char buf[1];
buf[0] = address;
if((write(fd,buf,1))!= 1){
printf("Error writing to i2c slave\n");
exit(1);
}
if(read(fd,buf,1)!=1){
printf("Error reading from i2c slave\n");
exit(1);
}
return buf[0];
}
static void
HMC5883L_readData(
int *idata,
int fd)
{
unsigned char i,addr,data[6];
for(i=0; i<6; i++){
addr = 0x03 + i;
data[i]=HMC5883L_read(addr,fd);
}
idata[0]=((int)data[0]<<24|(int)data[1]<<16)>>16;
idata[1]=((int)data[2]<<24|(int)data[3]<<16)>>16;
idata[2]=((int)data[4]<<24|(int)data[5]<<16)>>16;
return;
}
static void
HMC5883L_init(int fd)
{
unsigned char data;
data = HMC5883L_read(0x0a,fd);
if (data != 0x48) {
printf("Identification Register 0x0a check failure [%02x]",data);
exit(1);
}
data = HMC5883L_read(0x0b,fd);
if (data != 0x34) {
printf("Identification Register 0x0b check failure [%02x]",data);
exit(1);
}
data = HMC5883L_read(0x0c,fd);
if (data != 0x33) {
printf("Identification Register 0x0c check failure [%02x]",data);
exit(1);
}
HMC5883L_write(0x00,0xe0,fd); /* set default val to Config Reg A */
HMC5883L_write(0x02,0x00,fd); /* set continuous mode to Mode Reg */
return;
}
int
main(
int argc,
char **argv)
{
int i,j,fd,data[3];
char *i2cfile = "/dev/i2c-1";
unsigned char i2caddr,status;
double x,y,z;
i2caddr = 0x1e;
if ((fd = open(i2cfile, O_RDWR)) < 0) {
printf("Faild to open i2c port\n");
exit(1);
}
if (ioctl(fd, I2C_SLAVE, i2caddr) < 0) {
printf("Unable to get bus access to talk to slave\n");
exit(1);
}
HMC5883L_init(fd);
x = y = z = 0;
for(i=0,j=0; i<1000; i++) {
status = HMC5883L_read(0x09,fd);
if (status | 0x1) {
HMC5883L_readData(data,fd);
x += (double)data[0];
z += (double)data[1];
y += (double)data[2];
#if 0
printf("x[%05d] z[%05d] y[%05d]\n",
data[0],data[1],data[2]);
#endif
j++;
}
usleep(1000*10);
}
printf("%5.1lf %5.1lf %5.1lf\n",x/j,y/j,z/j);
return;
}
# coding:utf-8
require "pp"
require "net/https"
require "fileutils"
def xively(x,y,z)
uri = URI.parse('https://api.xively.com/v2/feeds/1679002984.xml')
https = Net::HTTP.new(uri.host,uri.port)
https.use_ssl = true
headers = {
'X-ApiKey' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX',
'Content-Type' => 'application/xml'
}
data =<<-EOS
<?xml version="1.0" encoding="UTF-8"?>
<eeml>
<environment>
<data id="HMC5883L_X">
<current_value>#{x}</current_value>
</data>
<data id="HMC5883L_Y">
<current_value>#{y}</current_value>
</data>
<data id="HMC5883L_Z">
<current_value>#{z}</current_value>
</data>
</environment>
</eeml>
EOS
res = https.send_request('PUT',uri.request_uri,data,headers)
end
now = Time.now
dir = File.expand_path(File.dirname(__FILE__))
command = File.join(dir,"hmc5883l")
x,y,z = `#{command}`.split(" ")
exit 0 unless x && y && z
dir = File.join(ENV["HOME"],"hmc588l",now.strftime("%Y"),now.strftime("%m"))
file = File.join(dir,now.strftime("%d")+".txt")
FileUtils.mkdir_p(dir)
mode = File.exists?(file) ? "a" : "w"
File.open(file,mode) do |io|
out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{x}\t#{y}\t#{z}"
io.puts out
end
begin
xively(x,y,z)
rescue Exception => ex
puts ex
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment