×

百叶窗控制开源分享

消耗积分:2 | 格式:zip | 大小:1.32 MB | 2022-11-14

分享资料个

描述

介绍

刚买了一栋新房子,想把所有东西都自动化,从百叶窗开始。看似简单的项目却变成了一场噩梦:相对高功率的电机(150W)正在摧毁我的继电器和三端双向可控硅开关,使用什么无线通信和控制器以及如何使其工作并不明显,噪音在线路中导致百叶窗的随机激活(在半夜非常可怕)......最后我设法用非常便宜的组件解决了所有这些问题,希望我可以帮助其他人避免这些头痛和很多时间。

不喜欢编程,但喜欢焊接?无论如何阅读教程,最后你会发现一个分立电路,它的作用相同,但没有智能。

解释

在控制电机时,一个重要的问题是它们的电感,这会导致在尝试打开电路时,电流会持续流过您的分断装置,从而产生非常高的电压。如果您尝试使用小型继电器在不采取任何预防措施的情况下断开电路,它们的触点会粘在一起,如果您使用三端双向可控硅开关(固态继电器),过电压(在我的情况下,我测量的峰值超过 1600V)会破坏半导体。

我通过谷歌搜索意识到,其他人对此有疑问,但他们采取了简单、昂贵和庞大的方式,他们只是获得更大的继电器,仍然需要廉价的继电器来激活更大的继电器,而触点仍然会受到影响并且可能最终失败。作为一名工程师,我不能让自己得不到最有效的解决方案。:) 在下面的示意图中,您可以通过添加一个电阻器、一个电容器和一个变阻器来节省这个大继电器。

压敏电阻保护三端双向可控硅开关免受过压。电阻加电容形成一个 RC 缓冲电路,在断路换向期间吸收能量。

[ PS:由于我在制作项目后很长时间直接从脑海中写出教程,前几天仔细查看我的电路板我意识到,在实际电路中,我将电阻器和电容器放置在棕色和灰色线之间(根据原理图颜色)每个电机而不是三端双向可控硅触点。这两种解决方案都适用于这种情况,但第二种选择的优点是缓冲器不会永久连接到电源上。]

[ PS2:SebDominguez还用实际配置做了一个很好的架构:

 
poYBAGNtrb2AA-okAAMk7vjohfE964.png
实际执行
 

]

开关不是为每个百叶窗使用一个引脚用于向上命令,另一个用于向下命令,而是共享一条公共线,指示百叶窗是否必须向上或向下。所以我们使用 5 个输入而不是 8 个。不需要过滤器,输入是软件去抖动的。

首先,Arduino 激活继电器模块以选择电机方向,经过一小段延迟后,继电器触点已经到位,它激活三端双向可控硅开关,通过廉价的继电器和三端双向可控硅开关模块为电机供电 230 VAC,没有问题。断开电路的过程是相反的,首先是三端双向可控硅开关,然后是继电器,因此继电器永远不会受到带电换向的影响。

您可以使用一到四个电机,无需修改代码,如果您不使用其他电机,拥有其他电机的逻辑不会有害,除非您需要其他用途的引脚,显然。

在家里,我们有两个故事,因此有两个电路。由于远程命令必须是唯一的,因此我通过在上传时注释一行使代码对其中任何一个都有效。如果您只安装一个电路,则无需更改任何内容,但如果您要构建两个电路,那么您已经免费获得了解决方案。事实上我只是骗你的,我们有三个电路,但总共有 8 个百叶窗,在一个电路中,我们占用了所有四个电机,但是其他四个百叶窗通过使用一个 Arduino 中的前三个输入并且只输入数字而分成两部分四个在第二。复制的电路对远程命令的反应完全相同,但在没有任何连接的情况下,没有任何东西可以激活。:) 如果您使用的是代码的 MySensors 版本,

抱歉,它不是很花哨和清晰,但它是真实的安装,是很久以前制作的,不仅仅是为本教程准备的电路,我无法在桌子上展示给你看。如您所见,它适合 22 x 15 x 5,2 厘米的壁箱,但非常紧凑。我的做法是用热胶枪把所有东西都放进一个打开的木箱里:实用、快捷、简单。

如果您将 Web IDE 用于 Arduino 草图,它应该会自动找到所有需要的库。

遥控器(可选)

本教程的目的是解决电感问题,但另外还有远程控制功能。

提供的代码包括通过无线电模块 nrf24l01+ 进行远程控制的两种方式:使用 MySensors(推荐),或通过发送带有盲数和命令 0 或 1 的整数来向上或向下。

在这两种情况下,我都使用 RPi 作为主机,直接连接一个 nRF24L01+ 模块,并安装了一个控制器 (Domoticz)。

对于第一个选项,使用 MySensors,需要安装 MySensors MQTT 网关。在我的实现中,将其配置为本地主机中的以太网。按照链接中的步骤操作,这里有我的配置参数可以帮助你(检查你是否需要相同的参数):

sudo ./configure --my-gateway=mqtt --my-controller-ip-address=127.0.0.1 --my-mqtt-publish-topic-prefix=domoticz/in/MyMQTT --my-mqtt-subscribe-topic -prefix=domoticz/out/MyMQTT --my-mqtt-client-id=mygateway1 --my-transport=rf24 --my-port=1883 --my-rf24-irq-pin=15

完成后,它在 Domoticz 中的集成非常简单:添加 HW MySensors MQTT 网关,为节点供电,然后在设置新硬件时直接找到它。

对于第二个选项,直接使用自定义应用程序,而不是 MySensors,虚拟交换机执行控制台命令:

 ./remote -m XY 

(X:盲#,Y:动作)。

在 Arduino 脚本的标题中,您可以找到更多详细信息。

这个远程命令的代码在http://hack.lenotta.com/arduino-raspberry-pi-switching-light-with-nrf24l01/中描述Node.js部分和 Arduino 草图,我们不需要他们和那个草图实际上有一个错误。我们需要的只是“灯开关应用程序”部分。硬件部分也可用于无线电连接。顺便说一句,始终将 10 uF 电容器放在无线电模块电源引脚上。如果有空间,还可以考虑购买带有外部天线的无线电模块。在室内,PCB 天线的范围可能非常有限(小于 10 m),特别是如果模块像这个项目一样被封闭在墙壁中。

请记住,此代码必须稍作修改,将无线电参数与 Arduino 匹配,并且使代码仅发送一次命令,而不是在未收到响应时重试最多 5 次,否则在丢失的情况下Arduino 反馈,您将看到您的百叶窗在作用-停止-作用-停止-作用。

Raspberry 的最终代码如下所示:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//RF24 radio("/dev/spidev0.0",8000000 , 25);  
//RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
//const int role_pin = 7;
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
//const uint8_t pipes[][6] = {"1Node","2Node"};
// hack to avoid SEG FAULT, issue #46 on RF24 github https://github.com/TMRh20/RF24.git
unsigned long  got_message;
void setup(void){
	//Prepare the radio module
	printf("\nPreparing interface\n");
	radio.begin();
	radio.setRetries( 15, 15);
	radio.setChannel(0x70);
	radio.setDataRate(RF24_250KBPS);
	radio.setPALevel(RF24_PA_MAX);
	radio.printDetails();
	radio.openWritingPipe(pipes[0]);
	radio.openReadingPipe(1,pipes[1]);
	//	radio.startListening();
}
bool sendMessage(int action){
	//This function send a message, the 'action', to the arduino and wait for answer
	//Returns true if ACK package is received
	//Stop listening
	radio.stopListening();
	unsigned long message = action;
	printf("Now sending  %lu...", message);
	//Send the message
	bool ok = radio.write( &message, sizeof(unsigned long) );
	if (!ok){
		printf("failed...\n\r");
	}else{
		printf("ok!\n\r");
	}	
	//Listen for ACK
	radio.startListening();
	//Let's take the time while we listen
	unsigned long started_waiting_at = millis();
	bool timeout = false;
	while ( ! radio.available() && ! timeout ) {
		//printf("%d", !radio.available());
		if (millis() - started_waiting_at > 1000 ){
			timeout = true;
		}
	}
	if( timeout ){
		//If we waited too long the transmission failed
		printf("Puta mierda, no me responde nadie...\n\r");
		return false;
	}else{
		//If we received the message in time, let's read it and print it
		radio.read( &got_message, sizeof(unsigned long) );
		printf("Yeah, me han respondido > %lu.\n\r",got_message);
		return true;
	}
}  
int main( int argc, char ** argv){
	char choice;
	setup();
	bool switched = false;
	int counter = 0;
	//Define the options
	while(( choice = getopt( argc, argv, "m:")) != -1){
		if (choice == 'm'){
			printf("\n Talking with my NRF24l01+ friends out there....\n");
			while(switched == false && counter < 1){   //Number of attemps to send the message
				switched = sendMessage(atoi(optarg));
				counter ++;
				sleep(1);
			}
		}else{
			// A little help:
			printf("\n\rIt's time to make some choices...\n");
			printf("\n\rTIP: Use -m idAction for the message to send. ");
			printf("\n\rExample (id number 12, action number 1): ");
			printf("\nsudo ./remote -m 121\n");
		}
		//return 0 if everything went good, 2 otherwise
		if (counter < 5)
			return 0;
		else
			return 2;
	}
} 

由于需要编译等,我为您提供了简单的操作,并将您需要的所有内容(仅适用于 Raspberry 端,Arduino 草图如下)放在一个 zip 文件中,其中包含修改后的源代码、库和编译代码树莓派 3:

https://goo.gl/ocCwk3

如果你把它解压到你的 RPi 中,你应该可以运行远程命令。

结果

在这里你可以看到我是如何实现一切的。

墙上的三对开关控制三个百叶窗。墙上的平板电脑显示了带有虚拟开关的 Domoticz 界面。平板电脑后面是 Raspberry,其中安装了控制器等。Arduino 不在这里,它靠近上图中的百叶窗;RPi 和 Arduino 通过无线电模块无线连接。

在这里,您还可以看到 Google Home,它通过使用带有 Webhooks 服务的 IFTTT 和 Domoticz 帮助我实现任何语音命令,例如“Hey Google,盲目”。如果您已经达到了这一点,那么您肯定可以毫无问题地使用语音命令。

在这里,您有一个非常快速的视频显示结果。

 

让我知道本教程是否对您有所帮助!

此致,

戈美星

PS 作为好奇心的补充,或者因为你真的讨厌计算机、编程或其他什么,我首先尝试在没有任何智能的情况下离散地制作解决方案。这是结果:

 
poYBAGNtreuAESXIAACHbUdGSTY878.png
 

我什至搭建了它,电路完成了这项工作,但我在熟悉 Arduino 平台之前就完成了,它更灵活且完全可靠,因此我不打算解释它。如果它对您有任何用处,那就太好了,但这不是本教程的范围,我不鼓励使用它。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'百叶窗控制开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);