用户
 找回密码
 立即注册

QQ登录

只需要一步,快速开始

搜索

26

主题

45

帖子

463

积分

版主

Rank: 7Rank: 7Rank: 7

积分
463
2016-11-25 19:24:08 Raspberry 版主 楼主 01277
首先,你需要以下东西:

电动百叶窗
树莓派2/3
焊枪
钢丝钳

先来看亦可赛艇的视频演示:
http://v.youku.com/v_show/id_XMTU2ODYwNjc1Ng==.html

换种思维,不用控制继电器。这儿是直接控制百叶窗的遥控器
111111.jpg

1、 我的百叶窗是用无线遥控器控制,当然,不会是仅仅创建一个小射频发射器。我拆卸了 现有的远程控制,并通过 GPIO 引脚将其连接到树莓派。

2、这个遥控器有多个按钮,你可以针对不同的指令进行修改。

3、创建一个 Windows 10 UWP 程序作为后台服务程序并被 Cortana 调用以监听指令。

4、选择指令内容,设定操纵走向和时间。格式如:http://[RASPBERRYPI]/blinds/[BLINDNUMBER]/[DIRECTION]/[SECONDS]

5、代码:
  1. using LagoVista.Common.UWP.Services;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Windows.Devices.Gpio;

  9. namespace LagoVista.ManCave.Services
  10. {
  11.     public class BlindsServer : SimpleRest
  12.     {
  13.         const int LED1 = 26;
  14.         const int LED2 = 27;
  15.         const int LED3 = 13;
  16.         const int LED4 = 6;
  17.         const int LED5 = 5;


  18.         const int CENTER_BUTTON = 16;
  19.         const int DOWN_BUTTON = 22;
  20.         const int RIGHT_BUTTON = 18;
  21.         const int UP_BUTTON = 12;
  22.         const int LEFT_BUTTON = 25;


  23.         private GpioPin _led1In;
  24.         private GpioPin _led2In;
  25.         private GpioPin _led3In;
  26.         private GpioPin _led4In;
  27.         private GpioPin _led5In;

  28.         private GpioPin _btnCntrOut;
  29.         private GpioPin _btnUpOut;
  30.         private GpioPin _btnDownOut;
  31.         private GpioPin _btnLeftOut;
  32.         private GpioPin _btnRightOut;

  33.         private static BlindsServer _instance = new BlindsServer();

  34.         private BlindsServer()
  35.         {

  36.         }

  37.         public static BlindsServer Instance { get { return _instance; } }


  38.         public void Init(int port)
  39.         {
  40.             Port = port;
  41.             StartServer();

  42.             var gpio = GpioController.GetDefault();

  43.             _led1In = gpio.OpenPin(LED1);
  44.             _led2In = gpio.OpenPin(LED2);
  45.             _led3In = gpio.OpenPin(LED3);
  46.             _led4In = gpio.OpenPin(LED4);
  47.             _led5In = gpio.OpenPin(LED5);

  48.             _btnCntrOut = gpio.OpenPin(CENTER_BUTTON);
  49.             _btnDownOut = gpio.OpenPin(DOWN_BUTTON);
  50.             _btnLeftOut = gpio.OpenPin(LEFT_BUTTON);
  51.             _btnRightOut = gpio.OpenPin(RIGHT_BUTTON);
  52.             _btnUpOut = gpio.OpenPin(UP_BUTTON);

  53.             _led1In.SetDriveMode(GpioPinDriveMode.Input);
  54.             _led2In.SetDriveMode(GpioPinDriveMode.Input);
  55.             _led3In.SetDriveMode(GpioPinDriveMode.Input);
  56.             _led4In.SetDriveMode(GpioPinDriveMode.Input);
  57.             _led5In.SetDriveMode(GpioPinDriveMode.Input);

  58.             _btnCntrOut.SetDriveMode(GpioPinDriveMode.Output);
  59.             _btnDownOut.SetDriveMode(GpioPinDriveMode.Output);
  60.             _btnLeftOut.SetDriveMode(GpioPinDriveMode.Output);
  61.             _btnUpOut.SetDriveMode(GpioPinDriveMode.Output);
  62.             _btnRightOut.SetDriveMode(GpioPinDriveMode.Output);

  63.             _btnCntrOut.Write(GpioPinValue.Low);
  64.             _btnDownOut.Write(GpioPinValue.Low);
  65.             _btnUpOut.Write(GpioPinValue.Low);
  66.             _btnRightOut.Write(GpioPinValue.Low);
  67.             _btnLeftOut.Write(GpioPinValue.Low);
  68.         }

  69.         private async Task MoveToPosition(int position)
  70.         {
  71.             var correctPosition = false;
  72.             var loopCount = 0;

  73.             Debug.WriteLine("MOVING TO POSITION: " + position);

  74.             while (!correctPosition && loopCount++ < 12)
  75.             {
  76.                 _btnRightOut.Write(GpioPinValue.High);
  77.                 await Task.Delay(100);
  78.                 _btnRightOut.Write(GpioPinValue.Low);
  79.                 await Task.Delay(100);

  80.                 if (position == 0 && _led1In.Read() == GpioPinValue.Low && _led2In.Read() == GpioPinValue.Low && _led3In.Read() == GpioPinValue.Low && _led4In.Read() == GpioPinValue.Low && _led5In.Read() == GpioPinValue.Low)
  81.                     correctPosition = true;

  82.                 if (position == 1 && _led1In.Read() == GpioPinValue.Low && _led2In.Read() == GpioPinValue.High && _led3In.Read() == GpioPinValue.High && _led4In.Read() == GpioPinValue.High && _led5In.Read() == GpioPinValue.High)
  83.                     correctPosition = true;

  84.                 if (position == 2 && _led1In.Read() == GpioPinValue.High && _led2In.Read() == GpioPinValue.Low && _led3In.Read() == GpioPinValue.High && _led4In.Read() == GpioPinValue.High && _led5In.Read() == GpioPinValue.High)
  85.                     correctPosition = true;

  86.                 if (position == 3 && _led1In.Read() == GpioPinValue.High && _led2In.Read() == GpioPinValue.High && _led3In.Read() == GpioPinValue.Low && _led4In.Read() == GpioPinValue.High && _led5In.Read() == GpioPinValue.High)
  87.                     correctPosition = true;

  88.                 if (position == 4 && _led1In.Read() == GpioPinValue.High && _led2In.Read() == GpioPinValue.High && _led3In.Read() == GpioPinValue.High && _led4In.Read() == GpioPinValue.Low && _led5In.Read() == GpioPinValue.High)
  89.                     correctPosition = true;

  90.                 if (position == 5 && _led1In.Read() == GpioPinValue.High && _led2In.Read() == GpioPinValue.High && _led3In.Read() == GpioPinValue.High && _led4In.Read() == GpioPinValue.High && _led5In.Read() == GpioPinValue.Low)
  91.                     correctPosition = true;

  92.                 Debug.WriteLine("FOUND MATCH: " + correctPosition);
  93.             }
  94.         }

  95.         private async void MoveBlind(int blind, String command, int? ms = null)
  96.         {
  97.             Debug.WriteLine("COMMAND => " + command);

  98.             await MoveToPosition(blind);
  99.             if (command == "up")
  100.             {
  101.                 _btnUpOut.Write(GpioPinValue.High);
  102.                 await Task.Delay(1000);
  103.                 _btnUpOut.Write(GpioPinValue.Low);
  104.             }
  105.             else if (command == "down")
  106.             {
  107.                 Debug.WriteLine("DOWN");
  108.                 _btnDownOut.Write(GpioPinValue.High);
  109.                 await Task.Delay(1000);
  110.                 _btnDownOut.Write(GpioPinValue.Low);
  111.                 Debug.WriteLine("DONE");
  112.             }
  113.             else if (command == "stop")
  114.             {
  115.                 _btnCntrOut.Write(GpioPinValue.High);
  116.                 await Task.Delay(1000);
  117.                 _btnCntrOut.Write(GpioPinValue.Low);
  118.             }

  119.             if (ms.HasValue)
  120.             {
  121.                 await Task.Delay(ms.Value);
  122.                 _btnCntrOut.Write(GpioPinValue.High);
  123.                 await Task.Delay(500);
  124.                 _btnCntrOut.Write(GpioPinValue.Low);
  125.             }
  126.         }

  127.         public override String Process(String queryString)
  128.         {
  129.             Debug.WriteLine(queryString);
  130.             queryString = queryString.Trim('/');

  131.             var parts = queryString.ToLower().Split('/');

  132.             if (parts.Length > 0)
  133.             {
  134.                 if (parts[0] == "blind")
  135.                 {
  136.                     int blind = 0;
  137.                     if (int.TryParse(parts[1], out blind))
  138.                     {
  139.                         var command = parts[2];
  140.                         if (parts.Length > 3)
  141.                         {
  142.                             int ms = 0;
  143.                             if (int.TryParse(parts[3], out ms))
  144.                             {
  145.                                 MoveBlind(blind, command, ms);
  146.                                 return "{'result':'ok'}";
  147.                             }
  148.                             else
  149.                             {
  150.                                 return "{'result':'invalidQUeryString'}";
  151.                             }
  152.                         }

  153.                         MoveBlind(blind, command);
  154.                         return "{'result':'ok'}";
  155.                     }
  156.                     else
  157.                         return "{'result':'invalidQUeryString'}";
  158.                 }
  159.                 return "{'result':'unknownCommand'}";

  160.             }
  161.             return "{'result':'invalidQUeryString'}";
  162.         }

  163.     }
  164. }
复制代码




使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册