Raspberry Pi 树莓派GPIO学习 – 控制家用电灯

如果不是那天偶然看到有位盆友在炫耀他的新技能:用树莓派通过Java实现远程控制电灯,上次购置折腾系列配件的时候也不会多买一个继电器,ok,既然买了,就把他折腾起来。

目的:
用程序控制家用灯泡,好像很酷的样子。

准备材料:
1. 树莓派一只
2. 5V低电平继电器扩展版
3. 家用灯泡一只
4. 公对母杜邦线三根
5. 面包板一块(可无)
6. 普通电线一段,用于连接灯泡

先来张图树莓派、面包板、继电器连接图

原理图是很简单的,继电器扩展版上低电端有三个引脚,分别是VCC、GND、IN,名词解释为:电源,接地,输入引脚。

简单的连线图(Fritzing还不会用):

树莓派连接5V低电平继电器示意图

所用继电器扩展版

继电器针脚接线图

VCC接树莓派5V针脚(红色)
GND 接树莓派GND针脚(棕色)
IN接树莓派GPIO25,或者其他的GPIO也可以,只要与程序控制的pin脚是一致的(橙色)

红色、棕色、橙色的杜邦线接法与下图“面包板接线图”是一致的

接好之后继电器扩展版的电源灯是亮的(红色LED)

继电器正面图这是继电器的玉照,有必要说明一下三个端点,常开、公共、常闭。

常开,正常状态为开路(开路即断开的),通电后关闭(连通)
公共端,顾名思义
常闭,正常状态为闭合(连通状态),通电后断开(开路)

因此,继电器是没有正负极之分,正负极可以任意接在常开或常闭,是否有电流通过取决于当前低电端给予的电平情况。

PS:接入家用电之后,强电端与继电器扩展版底部都是有电的,需谨慎操作,不幸的我就被电过一次,所以折腾的时候请小心。

再来张面包板的接线图:

面包板PIN接线图

很简单,没什么多说的,关于上图中针脚p*与GPIO对应关系,参考这里的关系图:https://lison.cc/?p=54

 

最终要实现的开关效果并不是带有ON/OFF的那种,往上按开,往下按关,而是类似电脑的开机键,按一下开,再按一下关。(有谁知道这种开关专业名称叫什么,老师说过,不过我忘了)

具体实现原理是读取GPIO针脚的电平状态,如果高电,说明已经打开,此时需关闭;如果低电,说明已经关闭,此时需打开。

程序中没有用到循环,而是执行一次开,再执行一次关。

还是直接贴代码:

wiringPi控制电灯源码light.c

 

唯一注意一点是为GPIO口设置高低电平时需先设置pin的模式,INPUT/OUTPUT。

wiringPi的官方资料还是要仔细看看的。

再来个演示视频:

后记
视频最后没有录制完,最后使用手机安装ConnectBot,可以远程用putty连接树莓派,并执行sudo ./light,从而以另一种欺骗的方式实现手机远程智能家居,以后研究一下android做个app控制家用电器。

参考文章:
http://wiringpi.com/reference/core-functions/
http://cafe.miwor.com/SAH/12.html

树莓派编号引脚说明:
http://blog.csdn.net/jcdjx/article/details/41866219

 

如果在赌气的生活工作,我是不是会输掉一些事,一些时间

热狗说,当兴趣不再是兴趣,或许变成一种谋生的工具,我该怎么看我自己。

一路向前,从来没有回头看过走过的路,脚下的印记也不知是深是浅,这一路,是否踏实,我不清楚。

一直有两种处事心态在挣扎,perfect和得过且过。英雄是不问出处,但是成为英雄的路,没有人会问起。

或许该放下互相攀比的心态,人各有志,人各有名。放下计较,做简单的我,三亩良田,我可以过的不错,过的对得起。

烦乱的思绪太多,何时会有结果,我该做考虑。

树莓派获取主板温度并采用图标显示

记录今天在淅淅沥沥的小雨下宅了一天的,算是收获吧。

之前就看到有文章写道利用树莓派系统内置命令获取主板温度的方法,由于处于学习阶段,只是尝试了一下获取温度重定向到另外的输出文件就停止了,今天没事做,于是就戳了一下相关的功能。

目的:
获取树莓派主板的温度,并在页面上以图标的方式展现出来。

涉及知识:(都是入门级的)
linux进程与系统调用
linux下文件操作
文件描述表
进程标准输入、输出、重定向
jQuery+HighCharts图表插件

直接贴代码吧,搞完了剪头去。

#include<stdio.h>
#include<stdlib.h>
//默认执行的秒数
#define TIMES 60
//默认输出的文件路径
#define LOGFILE “temperature.log”
//第一个参数为执行的秒数
//第二个参数为重定向到新文件的路径(名称)
int main(int argc,char *argv[])
{
int times=TIMES;
FILE *f_log;
//初始化执行的次数
if(argv[1]!=NULL)
times=atoi(argv[1]);
//打开文件指针
if(argv[2]!=NULL)
f_log=fopen(argv[2],”a+”);
else
f_log=fopen(LOGFILE,”a+”);
//将默认输出管道重定向至文件指针,f_temp
dup2(fileno(f_log),1);
while(times>0)
{
//system调用系统文件,默认输出将重定向至文件指针指向的文件
//获取主板温度
system(“/opt/vc/bin/vcgencmd measure_temp”);
//获取系统时间
system(“date”);
printf(“%d\n”,times);
times–;
sleep(1);
}
//关闭文件指针
fclose(f_log);
return 0;
}
编译与调用:
make pi_temp && ./pi_temp 60 temperature2.log
参数解释:
60表示会执行60次,也就是60秒
temperature2.log 获取主板温度之后的数据将输出到此文件中
等待60秒之后,*.log中的内容看起来是这样的:(请自动忽略时间部分)

temp=45.5’C

Sat Apr 26 15:31:26 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:27 HKT 2014
temp=45.5’C
Sat Apr 26 15:31:28 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:29 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:30 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:31 HKT 2014

把这些内容复制到:https://lison.cc/pi_temp/temp.html 这个页面的文本框中,点击提交按钮,图标会根据数据展示特定时间内的温度变化曲线,如图:

QQ截图20140426152944

后续:

1.既然能够获取主板温度,是不是也可以获取CPU温度等其他温度,如果可以的话,可以获取内容在同一图表进行展现。

2.既然能够获取这些温度,就可以外接风扇,监控温度,若超过设定值,自动开启风扇进行散热了,有时间再戳吧。

代码格式有点乱,直接来个图吧:

pi_temp.c源代码截图

 

改进版的代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>

//默认执行的秒数
#define TIMES 60

//默认输出的文件路径
#define LOGFILE “temperature.log”

//循环条件,传入-1将无限循环
#define LOOPCONDITION(x)(x==-1?1:x)

//显示错误信息并退出程序
void error(char *msg)
{
puts(msg);
exit(1);
}

/*
* argc 执行的秒数(次数)
* argv 重定向到新文件的路径(名称)
*/
int main(int argc,char *argv[])
{
int times;
FILE *f_log;

if(argc==1)
{
times=TIMES;
f_log=fopen(LOGFILE,”a+”);
}
else if(argc==2)
{
//初始化执行的次数
if(atoi(argv[1]))
times=atoi(argv[1]);
else
fopen(argv[1],”a+”);
}
else if(argc==3)
{
if(atoi(argv[1]))
times=atoi(argv[1]);
else
error(“Invalid times formate”);

f_log=fopen(argv[2],”a+”);
}
else
error(“Unkow argument format”);

//克隆当前进程,产生子进程
pid_t pid=fork();

if(pid==-1)
error(“Cannot fork process”);

//创建父子进程连接管道
int fd[2];
if(pipe(fd)==-1)
error(“Cannot create pipe”);

//子进程
if(!pid)
{
//关闭子进程的输入管道
close(fd[0]);

//将子进程的输出管道重定向到f_log的输入管道
dup2(fileno(f_log),1);
}

int status;
while(LOOPCONDITION(times))
{
//system调用系统文件,默认输出将重定向至文件指针指向的文件
//获取主板温度
system(“/opt/vc/bin/vcgencmd measure_temp”);

//获取系统时间
system(“date”);

times–;
sleep(1);
}

//关闭文件指针
fclose(f_log);

return 0;
}

Raspberry Pi 树莓派GPIO学习 – wiringPi控制LED灯闪烁

目的:
用树莓派点亮LED,并控制LED灯的亮与灭。

准备材料(如下图):
硬件:
LED灯一只
220欧姆电阻一只
树莓派一只
母对母杜邦线三根

树莓派控制LED灯准备材料

软件:
1.wiringPi,开源树莓派GPIO操作库,C语言版,安装方法:http://blog.csdn.net/xukai871105/article/details/17737005

今晚是第二次折腾树莓派的GPIO口,昨晚没搞定,因为完全没有仔细看wiringPi与GPIO对应图:9825bc315c6034a8f3056360ca13495408237668

举个栗子:

3.3v是树莓派26个针脚的第一个,6是GND口,1口+6口接通LED灯是亮的,这是普通的电流回路,但是无法通过高低电平控制,也就无法通过程序控制。可以看到上图中3.3v对应wiringPi Pin中都是“—“,姑且理解为不使用吧。而wiringPi的pin是从GPIO1开始的,上图中的第六行第五列,wiringPi是1,这个1就是程序可以控制高低电平的。这就是树莓派的GPIO与wiringPi的对应关系。

GPIO口的接线细节图

程序代码:
树莓派GPIO控制LED程序代码

编译运行,引用wiringPi库,位于/usr/local/lib:
gcc blink.c -o blink -lwiringPi
sudo ./blink

演示视频:

结论:

昨晚x宝来货,于是开始戳树莓派的GPIO口,正极接了3.3V,负极接了GND,灯亮了,很开心。但是wiringPi控制的digitalWrite却始终没反应,终了,搞不定,不能睡太晚,还要赶班车,于是便睡下了。
[ 是的,走马观花注定一事无成。]

为你的树莓派设置静态ip

所以说,不管做什么都不要粗心大意,那些误删文件找不回来挖个洞躲着哭的,那些设置树莓派静态ip漏删了一句话导致pi吃了半个月灰的(冏)。。。

自从上次设置树莓派静态ip漏删了一个地方,不能连接树莓派,吃灰了接近两个周,手头又没有显示器,usb转com口折腾来折腾去都是unknow device以来(这句话好长啊),今天上班时发现pi又连不上了,难道是昨天电信给我发了条短信说要维护升级随机重置wlan密码?不对,回来之后发现各种网站还是能上的(除了GF干掉的那些,例如:http://www.google.com/analytics),这是怎么一个回事。

情况是这样的:

电信疯了我的80端口(草泥煤),遂在路由上做了8000端口转发到192.168.1.104的8000端口(树莓派的ip地址,dhcp的)。

其他端口例如putty的, vnc的也相应都做了转发。

但是我发现情况是这样的:

光纤猫,路由都正常,唯独树莓派的ip从192.168..1.104变成了192.168.1.100,为什么?不解,难道是路由太寂寞自己重启了导致树莓派dhcp到了新地址?随便了,要不是这个事儿,我还是不会去问度娘:“树莓派静态ip”。

正文終于來了(轉載内容,但根據自身情況修改了一些):

1.#vim打開網絡配置的文件
 sudo vim /etc/network/interfaces

2.#將其中的文件修改爲
auto lo

iface lo inet loopback
iface eth0 inet static
#iface eth0 inet dhcp

address 192.168.1.104
netmask 255.255.255.0
gateway 192.168.1.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

3.#重啓服務
sudo service networking restart

 

到這裡就搞定,若用putty連接的話,過一會兒會提示連接不上,有可能還要重啓一下pi。

原文地址:http://blog.csdn.net/cxhome213/article/details/8983247