ã«ããã·ãŒã³ã®äžã§ããããªãšç»åã¯ãã®ã©ã³ãã®æäœãšãã®äœæã®è©³çŽ°ãªæé ã瀺ããŸãã
äœæ¥å®æŒ
ã©ã³ãã¯ã14æéå ã®å€©æ°äºå ±ã衚瀺ã§ããŸãã æè¡çã«ã¯ãã©ã³ãå ã«14ã®æ°Žå¹³ã¬ãã«ããããŸãïŒãããã20åã®LEDã®RGB LEDã¹ããªããïŒã äžã®æåã®ã¬ãã«ã¯ã次ã®1æéã®åãã«ãªã倩æ°ã§ãã 次ã®ã¬ãã«ã¯ãããããã©ã¹1æéã§ãã åã¬ãã«ã§ã®æ°Žå¹³æ¹åã®åãã¯é¢šéã§ãã éšã®å¹æããããŸã-åã¬ãã«ã®æåãšæåŸã®éšåããã¹ãŠã®è²ã§æ»ããã«ç¹æ» ããŸãã
ããã§ã¯ãã©ã³ããéåžžã«åŒ·ãå ãã®ã§ããã®èšäºã®ãã¹ãŠã®åçãšãããªã¯é·ãèŠçãçµãŠæ®åœ±ãããããšã«æ³šæããå¿ èŠããããŸãã æ£çŽã«äœåºŠãè©ŠããŠã¿ãŸããããçŸå®ãšåããããªç¶æ³ã«ã¯è³ããŸããã§ããã
ã«ããŒãªãã®ã©ã³ãã®å¥ã®ãããªãšã éæ°Žé ïŒãã¹ãŠã®è²ã§èŒãã¹ãã©ã€ãã®ç«¯ïŒã®è¡šç€ºã瀺ã ãããªãèŠãããšãã§ããŸãã
èŠä»¶ãšèšèš
ãŸããèŠä»¶ãå®åŒåããŠã¿ãŸãããã
- æ°žç¶çãªã€ã³ã¿ãŒãããæ¥ç¶ã ã€ã³ã¿ãŒããããã倩æ°äºå ±ãåãåãå¿ èŠããããŸã
- èªæ²»ã ã©ã³ãã¯ä»ã®ããã€ã¹ã«äŸåããŠã¯ãããŸãã
- ããŸããŸãªæ°è±¡ããŒã¿ïŒæž©åºŠãéšãé·éšã颚ïŒã衚瀺ããæ©èœ
å°ãèããåŸãããããã«20åã®LEDããã12ã®æ°Žå¹³ã¬ãã«ãããé·æ¹åœ¢ã®ã©ã³ãã§åæ¢ããããšã«ããŸããã ããã«ããã12æéå ã®å€©æ°äºå ±ã衚瀺ã§ããŸãã åã¬ãã«ã®è²ã¯ããã®ãšãã®æ°æž©ã«ãã£ãŠç°ãªããŸãã åæã«ãåã¬ãã«ã«ã¯ãéšã颚ãé·ãªã©ã®ããŸããŸãªå¹æã衚瀺ããã®ã«ååãªæ°ã®LEDããããŸãã ãã®åŸãLEDãè¿œå ããããããã¬ãã«ã®æ°ã¯14ã«å¢å ããŸããã
é
ãŸãããã©ãããã©ãŒã ã決å®ããå¿ èŠããããŸããArduinoã®ãããªãªã¢ã«ã¿ã€ã ãã€ã¯ãã³ã³ãããŒã©ãŒããŸãã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæèŒãããRaspberry Piãªã©ã®æ¬æ Œçãªã³ã³ãã¥ãŒã¿ãŒã§ãã ãããã®ãªãã·ã§ã³ã«ã¯ããããé·æãšçæããããŸãã OSãRaspberry Piã«ããŒãããããŸã§10ç§åŸ ã€å¿ èŠããªããšããçç±ã ãã§ãArduinoã¯äžèŠãã®ãããžã§ã¯ãã«æé©ã§ãã ãã ããArduinoã䜿çšããŠããå Žåã§ããã€ã³ã¹ã¿ã³ãã³ãŒã«ãã¹ã¿ãŒãã¯æ©èœããŸãããWi-Fiã·ãŒã«ãã®åæåãšãµãŒããŒã®å€©æ°äºå ±ã®èŠæ±ã«ã¯ãŸã é 延ããããŸãã ãŸããwifiã·ãŒã«ãã®åææäœïŒãµãŒããŒã®äºæž¬ãèŠæ±ãããšãïŒãšLEDã¹ããªããã®æäœã«ã€ããŠã®è³ªåã«å°ãæ··ä¹±ããŸããã
åæ§ã«ãRaspberry Piã䜿çšããå Žåãæ¬ ç¹ã1ã€ãããããŸãããèµ·åæéã§ãã
Raspberry PiãWiFi USBãã³ã°ã«EdiMaxãšãšãã«äœ¿çšããããšã決å®ãããŸããã ãã®ãã³ã°ã«ã¯ç§ãä»ã®ãããžã§ã¯ãã§äœ¿çšãããã®ã§ãéåžžã«ãã蚌æãããŠããŸãã
次ã«ãé©åãªå æºãèŠã€ããå¿ èŠããããŸãã ããããã®èŠç©ããã§ã¯ãå°ãªããšãçŽ240åã®LEDïŒãããã20åã®LEDã®12ã¬ãã«ïŒãå¿ èŠã§ãã ããããã¹ãŠãäžåºŠã«1ã€ãã€ã¯ãã ä»ãããå¿ èŠããããªãã·ã§ã³ã¯èæ ®ãããŠããŸããã§ããã ç§ãã¡ã®éžæã¯å€§ãããããŸããïŒLEDããã«ãLEDã¹ããªããã®ã©ã¡ããã ããã«ã¯ãè¡šé¢ã«ããŸããŸãªæ¹Ÿæ²ã®ãªãå°ããªã©ã³ããå¿ èŠãªäººã«æé©ã§ãã äžåã®ã©ã³ããäœãããã£ãã®ã§ãLEDã¹ããªããã«èœã¡çããŸããã
ãããã£ãŠã1ã¡ãŒãã«ããã144åã®ãã¯ã»ã«å¯åºŠã®2ã¡ãŒãã«RGB LEDã¹ããªããã泚æãããŸããã ãã®ããŒãã«ã¯ã¢ãã¬ã¹æå®å¯èœãªLEDïŒããžã¿ã«ã§ã¢ãã¬ã¹æå®å¯èœãªã¿ã€ãã®LEDã¹ããªããïŒããããŸããã€ãŸããåLEDãç¬èªã®ããŒã¿ãåãåããå¿ èŠãªè²ã衚瀺ããããã«ä¿¡å·ã圢æã§ããŸãã ããŒãã®åLEDã«ããWS2811ãããããããæ åœããŠããŸãã ããŒãã«ã¯288åã®LEDããããããããããæ倧éã«äœ¿çšãã20åã®LEDã®14ã¬ãã«ãäœæããããšã«ããŸããïŒ
Raspberry Piã¯GPIOããŒãã§3.3ãã«ãããåºåããªãããšã«æ³šæããå¿ èŠããããŸãããããŒãã«ã¯5ãã«ãã®å¶åŸ¡ä¿¡å·ãå¿ èŠã§ãã ãããã£ãŠãé»å§ã³ã³ããŒã¿ïŒã¬ãã«ã³ã³ããŒã¿ãããïŒãå¿ èŠã§ãã 74AHCT125ã䜿çšããŸããã
æ¥ç¶å³ïŒ Adafruitãã¥ãŒããªã¢ã«ããååŸïŒïŒ
寞æ³ã60 x 20 cmã®ãããŒã©ã³ããäžè©±ãããè¿ãã®åºã§è³Œå ¥ãããŸããããLEDã¹ããªããçšã®é»æºãããã«çœ®ãå¿ èŠããããšæåŸ ããŠè³Œå ¥ãããŸããã 280åã®RGB LEDãšRaspberry Piãå ¥æãããããããªãã³ã³ãã¯ããªããã±ãŒãžã§5ãã«ã10ã¢ã³ãã¢ã®ãããã¯ã泚æããŸããã
ããããã¹ãŠãã©ã³ãã«å ¥ããæãæ¥ãŸããã é»æºã«ãããRaspberry Piã¯ãã¹ãŠã¯ãªã¢ã§ããã 14åã®ã»ã°ã¡ã³ããLEDã§åºå®ããæ¹æ³ã«ã€ããŠã¯èšããŸãããããã¯ã以åã¯ã¯ãã ä»ãããå¿ èŠããããŸããã LEDã¯ãããã«ããŒããäžå®ã®è·é¢ã«ããå¿ èŠããããŸããããããªããšãLEDãèŠããŠå ã匷ãããŸãã
åœåã®ã¢ã€ãã¢ã¯ãã¢ã«ãããŠã ã¹ããªããã䜿çšããããŒãã貌ãä»ããããšã§ããã ãããã1ã€ã®ãã¬ãŒã ãäœæãããšãæéãããããããããšãããã«ããããŸããã ãã®åŸã3Dããªã³ã¿ãŒã§ãã¬ãŒã ãå°å·ããããšã«ããŸããã ã¬ãŒã¶ãŒåœ«å»æ©ã«ã¢ã¯ã»ã¹ã§ããå Žåã¯ãããã«é«éã«å®è¡ã§ããŸãã 極端ãªå Žåã«ã¯ãæã§ãã¹ãŠãè¡ãããšãã§ããŸã-æšãŸãã¯æ®µããŒã«ããåãåãïŒãã®åŸãäœåºŠãå±€ãæ¥çããŸãïŒã
ãã¬ãŒã å°å·ïŒ
ãã¬ãŒã ã¯ãŒã¯ã§ã®æåã®ããŒããã¹ãïŒ
åèšã§ãå¿ èŠãªãã¹ãŠã®ã³ã³ããŒãã³ããå ¥æããã¢ã»ã³ããªã®é çªã«ãªããŸããã LEDã¹ããªããã¯20åã®LEDã«åå²ãããŸããã ããŒã¹ãã¯ãã ä»ããããã¬ãŒã ã«æ¥çããŸããã 次ã«ããã¬ãŒã ãäœã«æ¥çãããŸããã é»æºããã¹ãŠã®é ç·ãããã³Raspberry Piã¯ããã¬ãŒã ãšã·ã£ãŒã·ã®éã®ã¹ããŒã¹ã«é 眮ãããŸããã
ã©ã³ãã®çµã¿ç«ãŠããã»ã¹ïŒ
çµæïŒ é«è§£å床 ïŒïŒ
倩æ°äºå ±ãååŸãããµãŒãã¹
ã©ã³ããæ©èœããã«ã¯ã倩æ°äºå ±ãååŸããããã®ãµãŒãã¹ãå¿ èŠã§ãã ããã«ã¯ãå€æ°ã®ç¡æã®ã·ã§ã¢ãŠã§ã¢ãµãŒãã¹ããããŸãã ããšãã°ã openweathermap.orgãŸãã¯predict.ioã§ãã ãããã«ã¯ãã¹ãŠãç¬èªã®å¶éãŸãã¯ç¹å®ã®æ©èœããããŸãã
ç§ã®äž»ãªåºæºã®1ã€ã¯ãä»åŸ12æé以äžã®æéããšã®å€©æ°äºå ±ãååŸã§ããããšã§ããã æ®å¿µãªãããopenweathermapã¯ç¡æã¢ãŒãã§3æéã®å€©æ°äºå ±ã®ã¿ãè¿ãããšãã§ããŸãã ç§ã¯ãã®ãµãŒãã¹ã®é床ã奜ãã§ã¯ãããŸããã§ãããã倩æ°äºå ±ã30åã«1å以äžæŽæ°ããã€ããã¯ãªãã®ã§ããŸã£ããéèŠã§ã¯ãããŸããã§ããã
åæã«ãäºæž¬ã¯å®å šã«free.ioã§ã¯ãªããäœæ¥ã®é床ãšããŒã¿ã®ç²åºŠã«æºè¶³ããŠããŸãã å¿ èŠãªãã¹ãŠã®ããŒã¿ïŒæž©åºŠã颚éãééšéïŒã12æéå ãŸã§ååŸã§ããããã«1åã®ãªã¯ãšã¹ãã§ååŸã§ããŸããã ç¡æã¢ãŒãã§äœæã§ãããªã¯ãšã¹ãã®æ°ã¯1æ¥ããã1000件ã«å¶éãããŠããŸãããããã¯ç§ã®èŠä»¶ã«å®å šã«é©åããŠããŸãã æåŸã«ãççŽã«èšã£ãŠããã®ãªãœãŒã¹ãéžæããŸãããçŽèŠ³ã«é Œã£ãŠããŸãã
ããŒã¿ãåãåãæ¹æ³ã決å®ããå¿ èŠããããŸããïŒäžéãªãœãŒã¹ãä»ããŠããŸãã¯çŽæ¥predict.ioããã predict.ioãµãŒãã¹ãè¿ããJSONãã¡ã€ã«ã¯ãçŸåšå°ã«ã€ããŠçŽ40ãããã€ããè¿ããŸããããããã¯åé·ãªããã«æããŸããã 12æéããšã«å¿ èŠãªå€ã¯3ã€ã ãã§ãã ãã®çµæãã©ã³ãã«éä¿¡ãããããŒã¿ã®éãæå°éã«æããå°æ¥ããŒã¿ãœãŒã¹ããããã€ããŒãå€æŽããå¿ èŠãããå Žåã«å°æ¥ã®æ¡åŒµæ§ãæäŸãããšãã2ã€ã®çç±ã§ãç¬èªã®å°ããªãµãŒãã¹ãäœæããããšã«ããŸããã 1æéããšã«3ã€ã®å€ïŒæž©åºŠã颚éãééšïŒã®ã¿ãå¿ èŠãªå Žåãåèš168ãã€ããå¿ èŠã§ãïŒ14 * 3 *ãµã€ãºint = 4ïŒã ãŸããç§ã®ãµãŒãã¹ã§ã¯ãå°åœ¢ã®åº§æšãšãç¹å®ã®å°åœ¢ã®æäœæ°æž©ãšæé«æ°æž©ãèšå®ããŠããã®æ å ±ãRaspberry Piã®åŽé¢ã«ä¿åããªãããã«ããããšãã§ããŸãã
ãªã¯ãšã¹ãéã§å€ããã£ãã·ã¥ãããªã¯ãšã¹ããé »ç¹ã«çºçããå Žåããã£ãã·ã¥ããå€ãè¿ãïŒ1æ¥ããã1000件ã®ç¡æãªã¯ãšã¹ãã®å¶éãè¶ ããªãããã«ããïŒããã«ãpredict.ioã§åäœããJavaãµãŒãã¬ãããäœæããŸããã 5åããšã«1åã ãæ°ããäºæž¬ããªã¯ãšã¹ãããŸãã predict.ioã®APIããŒã ãã§ãªãå°åœ¢ã®åº§æšãã·ã¹ãã ãµãŒãã¬ããããååŸããããããå°åœ¢ãå€æŽããå¿ èŠãããå Žåã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®å€éšããè¡ãããšãã§ããŸãã
ãµãŒãã¬ããã³ãŒã
public class ForecastServlet extends HttpServlet { private static final String API_KEY = System.getenv("AL_API_KEY"); private static final int REQUEST_PERIOD = 5 * 60 * 1000; private static final int START_HOUR = 0; private static final int END_HOUR = 14; private static final int DATA_SIZE = 3 * 4 * (END_HOUR - START_HOUR); private static final int TEMP_MULTIPLY = 100; private static final int WIND_MULTIPLY = 100; private static final int PRECIP_MULTIPLY = 1000; private final String mutex = ""; private final ByteArrayOutputStream data = new ByteArrayOutputStream(DATA_SIZE); private long lastRequestTime; @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { synchronized (mutex) { if ((System.currentTimeMillis() - lastRequestTime) > REQUEST_PERIOD) { try { updateForecast(); } catch (IOException e) { e.printStackTrace(); } } response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Length", "" + data.size()); response.getOutputStream().write(data.toByteArray()); response.getOutputStream().flush(); response.getOutputStream().close(); lastRequestTime = System.currentTimeMillis(); } } private void updateForecast() throws IOException { int maxTemp = Integer.valueOf(System.getenv("AL_MAX_TEMP")) * TEMP_MULTIPLY; int minTemp = Integer.valueOf(System.getenv("AL_MIN_TEMP")) * TEMP_MULTIPLY; BufferedReader reader = null; try { String urlTemplate = "https://api.forecast.io/forecast/%s/%s,%s"; URL url = new URL(String.format(urlTemplate, API_KEY, System.getenv("AL_LAT"), System.getenv("AL_LON"))); InputStreamReader streamReader = new InputStreamReader(url.openStream()); reader = new BufferedReader(streamReader); JSONParser jsonParser = new JSONParser(); try { JSONObject jsonObject = (JSONObject) jsonParser.parse(reader); JSONArray hourly = (JSONArray) ((JSONObject) jsonObject.get("hourly")).get("data"); for (int i = START_HOUR; i < END_HOUR; i++) { JSONObject hour = (JSONObject) hourly.get(i); int temperature = safeIntFromJson(hour, "apparentTemperature", TEMP_MULTIPLY); if (temperature > maxTemp) { temperature = maxTemp; } else if (temperature < minTemp) { temperature = minTemp; } else { float tempFloat = (float) 100 / (maxTemp - minTemp) * (temperature - minTemp); temperature = (int) (tempFloat * TEMP_MULTIPLY); } int wind = safeIntFromJson(hour, "windSpeed", WIND_MULTIPLY); int precip = safeIntFromJson(hour, "precipIntensity", PRECIP_MULTIPLY); data.write(intToBytes(temperature)); data.write(intToBytes(wind)); data.write(intToBytes(precip)); } } catch (ParseException e) { e.printStackTrace(); } } finally { try { if (reader != null) reader.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } private byte[] intToBytes(int value) { return ByteBuffer.allocate(4).putInt(value).array(); } private int safeIntFromJson(final JSONObject data, final String dataKey, final int multiply) throws IOException { Object jsonAttrValue = data.get(dataKey); if (jsonAttrValue instanceof Long) { return (int) ((Long) jsonAttrValue * multiply); } else { return (int) ((Double) jsonAttrValue * multiply); } } }
å®è¡æã«ãªã¯ãšã¹ããã5ã€ã®ããããã£ã®æå³ã説æããå¿ èŠããããŸãã
AL_API_KEY-éçºè ã®ç§å¯éµã®äºæž¬.io
AL_LATãAL_LON-ãã±ãŒã·ã§ã³åº§æš
AL_MAX_TEMPãAL_MIN_TEMP-ç¹å®ã®ãšãªã¢ã®æäœããã³æé«æž©åºŠã ããã¯ã䜿çšããè²ã®ç¯å²ã®äžéšã®é åãç¡é§ã«ããªãããã«å¿ èŠã§ãïŒããšãã°ãç§ã®é åïŒãããµã¹å·ãç±³åœïŒ-枩床ã0æªæºã«äœäžããããšã¯ãªãã玫ã®è²ïŒãã¬ããã®æãäœãè²ïŒã瀺ãããã¢ã¹ã¯ã¯ã§ã¯0ã§ããã-25ã§ã¯ãããŸããã ãããã£ãŠããã®ãµãŒãã¹ã¯å®éã®æž©åºŠãè¿ããŸãã-AL_MIN_TEMPãšAL_MAX_TEMPã®éã®100åã®1ããŒã»ã³ããè¿ããŸãã
Webã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒããšMavenã¢ã»ã³ããªãã¡ã€ã«ã¯ã github.com / manusovich / aladdin-serviceãªããžããªã§å ¥æã§ããŸãã
次ã«ãJava Webã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã£ã³ã°ãå¿ èŠã§ãã ç§ã¯ãæ°ã«å ¥ãã®herokuãå©çšããŸããããä»ã®ãã®ã䜿çšã§ããŸãã ãªããžããªãŒã«ã¯ãProcfileãšããååã§herokuç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã«å¿ èŠãªãã¡ã€ã«ãæ¢ã«å«ãŸããŠããŸãã
ãããã£ãŠãherokuã䜿çšããå Žåãå¿ èŠãªããšã¯æ¬¡ã®ãšããã§ãã
- æ°ããã¢ããªã±ãŒã·ã§ã³ãäœæãã
- 3ã€ã®æ°ããã·ã¹ãã ããããã£ãå®çŸ©ãã
- gitãªããžããªã«ãªã³ã¯ããŸã
- ã¢ããªã±ãŒã·ã§ã³ãå±éããŸãã ãããè¡ãã«ã¯ãæåãããã€ãå®è¡ããå¿ èŠããããŸããããã¹ãŠã®ã³ãŒãã¯githubãªããžããªããèªåçã«ããŠã³ããŒããããã³ã³ãã€ã«ããã³èµ·åãããŸã
ããã§ããã©ãŠã¶ã§https://aladdin-service.herokuapp.com/forecastãªã³ã¯ãéããŠãµãŒãã¬ãããå®è¡ã§ããŸãã ãã®å Žåãç¹å®ã®å°åã®å€©æ°äºå ±ãã¡ã€ã«ïŒãµã€ãºã168ãã€ãïŒãè¿ãããŸãïŒherokuã®ã¢ããªã±ãŒã·ã§ã³ã®ããããã£ïŒ
ã©ã³ããµã€ããœãããŠã§ã¢
ãŸããLEDã¹ããªããã«ä¿¡å·ãéä¿¡ããæ¹æ³ã決å®ããå¿ èŠããããŸãã ããŒãã¯WS2811ãããã䜿çšããŠLEDãå¶åŸ¡ããŸãã çãæ€çŽ¢ã®åŸãç§ã¯Adafruitã®ãã¥ãŒããªã¢ã«-learn.adafruit.com/neopixels-on-raspberry-piã«åºäŒããŸãã ãããã§ãWS281xãããã«åºã¥ããŠããŒãã®ä¿¡å·ãçæããããšãã§ããrpi_ws281xã©ã€ãã©ãªãŒã«ã€ããŠèšåããŸããã
ã©ã€ãã©ãªãŒããªããžããªãŒã«åå²ããmain.cã«å¿ èŠãªã³ãŒããè¿œå ããŸããïŒã©ã³ãã³ã³ãããŒã©ãŒã®ã»ã¯ã·ã§ã³ã§ä»¥äžãåç §ïŒãéçºãæå°éã«æããããã§ãã
å°ãäœè«ãããå¿ èŠããããRaspberry Piã«åºã¥ããŠãããžã§ã¯ãã®ã³ãŒããéåžžã©ã®ããã«éçºãããã«ã€ããŠèª¬æããŸãã sshã䜿çšããã³ãŒãç·šéã¯ãŸã£ãã䟿å©ã§ã¯ãããŸããã§ããã sshãä»ããŠã³ãŒããæ°žç¶çã«ã³ããŒããŸãã ããã§ãGitHubãªããžããªãäœæããããã«ãã¹ãŠã®ã³ãŒããã¢ããããŒãããŠããæ°ã«å ¥ãã®IDEãéçºã«äœ¿çšããŸãã Raspberry PiåŽã§ã¯ã10ç§ããšã«ãªããžããªããå€æŽãååŸããããšããã·ã§ã«ã¹ã¯ãªãããäœæããŸãã ååšããå Žåãã¹ã¯ãªããã¯ããã°ã©ã ãåæ¢ããæŽæ°ãããŠã³ããŒããããã¹ãŠãã³ã³ãã€ã«ããŠããã°ã©ã ãå®è¡ããŸãã ã¹ã¯ãªããã¯èµ·åæã«ãã³ã°ããŸãã ããã«ãããã³ãŒãããªã¢ãŒãã§éçºã§ãããšåæã«ãããã€ã¹ã®å€æŽã確èªããããã»ã¹ãé«éåã§ããŸãã ããããåæã«wifiãããã¯ãŒã¯ãããŒãããŸãã ãœãããŠã§ã¢éçºãå®äºããããæŽæ°æéãé·ãããŸãïŒããšãã°ã60åïŒããã®ç¶æ ã®ãŸãŸã«ããŠãããŸãã
ãã®ããã«ããŠåŸãããã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- gitã§å€æŽããªã¯ãšã¹ããã
- ãªããžããªã«å€æŽãããå Žå
- ã³ãŒããæŽæ°
- ã³ãŒããã³ã³ãã€ã«ãã
- ã³ã³ãã€ã«ãæåããå Žå
- å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ãåæ¢
- æ°ããã¢ããªã±ãŒã·ã§ã³ãèµ·åãã
RaspberryPiãæ§æãã
- ãŸããWifiãèšå®ããå¿ èŠããããŸã
- ãã®åŸããªããžããªããã£ã¬ã¯ããª/ home / pi / rpi_ws281xã«è€è£œããå¿
èŠããããŸãïŒãã£ã¬ã¯ããª/ home / piã§å®è¡ïŒïŒ
git clone https://github.com/manusovich/rpi_ws281x
ã·ã§ã«ã¹ã¯ãªãã/home/pi/rpi_ws281x/forecast.shãèµ·å/etc/rc.localã«è¿œå ããå¿ èŠããããŸãã
sudo sh /home/pi/rpi_ws281x/forecast.sh >> /home/pi/ws281.log &
ãã®ã¹ã¯ãªããã¯ã倩æ°äºå ±ãæŽæ°ããã¢ããªã±ãŒã·ã§ã³ãèµ·åãã10åããšã«å€©æ°äºå ±ãæŽæ°ãã60åããšã«ãããžã§ã¯ããªããžããªã®å€æŽããã§ãã¯ããŸãã å€æŽãããå Žåããããã¯ãªããžããªããååŸãããã³ã³ãã€ã«ãããŠèµ·åãããŸãã
ã¹ã¯ãªããã³ãŒã
#!/bin/bash echo "Read forecast" curl https://aladdin-service.herokuapp.com/forecast > /home/pi/rpi_ws281x/forecast echo "Kill old instance..." pkill test echo "Run new instance..." exec /home/pi/rpi_ws281x/test & echo "Start pooling for changes" C=0 while true; do C=$((C+1)) # once per 10 minutes if [ $((C%60)) -eq 0 ] then echo "Update forecast... " curl https://aladdin-service.herokuapp.com/forecast > /home/pi/rpi_ws281x/forecast fi # once per one hour if [ $((C%360)) -eq 0 ] then echo "Check repository... " cd /home/pi/rpi_ws281x git fetch > build_log.txt 2>&1 if [ -s build_log.txt ] then echo "Application code has been changed. Getting changes..." cd /home/pi/rpi_ws281x git pull echo "Bulding application..." scons echo "Kill old application..." pkill test echo "Launch new application..." exec /home/pi/rpi_ws281x/test & echo "Done" else echo "No changes in the repository ($N)" fi fi sleep 10s done
ããã€ãã®ç¹ãæ確ã«ããå¿ èŠããããŸãã
- 絶察ãã¹-ãã®ã¹ã¯ãªããã¯èªåå®è¡ããèµ·åãããããããã¹ãŠã®ãã¹ãæå®ããå¿ èŠããããŸãã ãããã£ãŠãRaspberry Piã§ã¯ããªããžããªããã£ã¬ã¯ããª/ home / pi / rpi_ws281xã«è€è£œããå¿ èŠããããŸãã å¥ã®ãã¹ãããå Žåã¯ããã®ã·ã§ã«ã¹ã¯ãªãããæŽæ°ããå¿ èŠããããŸã
- ããŒã管çã³ãŒãã¯ãã€ã¬ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ã䜿çšãã管çè ãšããŠå®è¡ããå¿ èŠãããããããã®ã¹ã¯ãªããã¯ç®¡çè ãšããŠå®è¡ããå¿ èŠããããŸãã
ã©ã³ãã³ã³ãããŒã©ãŒ
次ã«ãLEDã¹ããªããäžã®LEDãå¶åŸ¡ããã³ãŒããèŠãŠã¿ãŸãããã ãã®ã³ãŒãã¯main.cãã¡ã€ã«ã«ãããç¡éã«ãŒãã§ãããLEDã®è²ãå€æŽããäžé£ã®æé ã§ãã
ãã®ããã°ã©ã ã®ã¡ã€ã³ã¡ãœããã«ã¯ãLEDã¹ããªãããæäœããããã®rpi_ws281xã©ã€ãã©ãªã®åæåãå«ãŸããç¶æ ãã¬ã³ããªã³ã°ããããã®ç¡éã«ãŒããéå§ããŸãã
ã¡ã€ã³ã¡ãœããã³ãŒã
int main(int argc, char *argv[]) { int frames_per_second = 30; int ret = 0; setup_handlers(); if (ws2811_init(&ledstring)) { return -1; } long c = 0; update_forecast(); matrix_render_forecast(); while (1) { matrix_fade(); matrix_render_wind(); matrix_render_precip(c); matrix_render(); if (ws2811_render(&ledstring)) { ret = -1; break; } usleep((useconds_t) (1000000 / frames_per_second)); c++; if (c % (frames_per_second * 60 * 5) == 0) { // each 5 minutes update forecast update_forecast(); } } ws2811_fini(&ledstring); return ret; }
update_forecastã¡ãœããã¯ããã¡ã€ã«/ home / pi / rpi_ws281x / forecastããçŸåšã®å€©æ°äºå ±ãèªã¿åããŸã
matrix_render_forecastã¡ãœããã¯ã倩æ°äºå ±ã®çŸåšã®å€ã§ãããªãã¯ã¹ãå¡ãã€ã¶ããŸãã ãã®éã paletton.comããååŸãã 23è²ã®ãã¬ããã䜿çšããŸã ã
ws2811_led_t dotcolors[] = { 0x882D61, 0x6F256F, 0x582A72, 0x4B2D73, 0x403075, 0x343477, 0x2E4272, 0x29506D, 0x226666, 0x277553, 0x2D882D, 0x609732, 0x7B9F35, 0x91A437, 0xAAAA39, 0xAAA039, 0xAA9739, 0xAA8E39, 0xAA8439, 0xAA7939, 0xAA6C39, 0xAA5939, 0xAA3939 };
matrix_fadeã¡ãœããã¯ãäºæž¬ããã枩床ããè²ã®å€åãæžè¡°ãããŸãã
matrix_render_windã¡ãœããã¯ã颚é*ã«å æ°ã§çããé床ã§æ°Žå¹³æ¹åã«ååŸã«ç§»åããå±èµ·ãæç»ããŸãã
matrix_render_precipã¡ãœããã¯ãã¬ãã«ã®ãšããžã«æ²¿ã£ãŠéæ°Žéãæç»ããŸãã å šäœçãªãªãã¬ãã·ã¥ã¬ãŒãã¯1ç§ããã30ãã¬ãŒã ã§ãããè²ãå€æŽããããã«éåžžã«è¿ éã«å€æããããã圌ã«ã¯å ±éã®ã«ãŠã³ã¿ãŒãå¿ èŠã§ãã ãããã£ãŠãããã¯1ç§éã«15åããè¡ããŸããã
ãã¹ãŠã®ã¬ã³ããªã³ã°ã¯XRGBãããªãã¯ã¹[WIDTH] [HEIGHT]ã«éãããŸãã è²ã®æŽæ°ã®ä»£ããã«æµ®åå°æ°ç¹æ°ãæ ŒçŽããã«ã¯ãXRGBæ§é ãå¿ èŠã§ãã ããã«ãããé·ç§»ã®æ»ããããå¢ããmatrix_renderã¡ãœããã§è¡ãRGBã«çŽæ¥å€æã§ããŸãã
ããã°ã©ã ãèµ·åãããšãçŸåšã®äºæž¬å€ïŒæž©åºŠã颚ãéæ°ŽéïŒãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã 枩床å€ãåºæºç¹ïŒ100åã®1ããŒã»ã³ãïŒã§ããããšã«æ³šæããŠãã ããã
pi@raspberrypi ~/rpi_ws281x $ sudo ./test Temp: 5978, Wind: 953, Precip: 0 Temp: 5847, Wind: 1099, Precip: 0 Temp: 5744, Wind: 1157, Precip: 0 Temp: 5657, Wind: 1267, Precip: 0 Temp: 5612, Wind: 1249, Precip: 1 Temp: 5534, Wind: 1357, Precip: 1 Temp: 5548, Wind: 1359, Precip: 0 Temp: 5605, Wind: 1378, Precip: 0 Temp: 5617, Wind: 1319, Precip: 0 Temp: 5597, Wind: 1281, Precip: 0 Temp: 5644, Wind: 1246, Precip: 0 Temp: 5667, Wind: 1277, Precip: 0
代æ¿åäœã¢ãŒã
çµæã®è£œåã¯ããããããã®ã衚瀺ããããã®ãã©ãããã©ãŒã ãšèããããšãã§ããŸãã èªç±ã«äœ¿ããLEDã¯çŽ300åãããããã«äœã衚瀺ãããã決ããããšãã§ããŸãã ããšãã°ãç¶ç¶çãªçµ±åãµãŒããŒã§ã¢ã»ã³ããªç¶æ ã®è¡šç€ºãæŽçãããã次ã®ãããªã®ããã«è¹è²ã§åçããçããã©ã³ããäœæãããã§ããŸãã
èŠç©ãããšçµè«
é»æº5ãã«ã10ã¢ã³ãã¢-25ãã«
2ã¡ãŒãã«ã®RGBããŒãïŒ1ã¡ãŒãã«ããã144åã®LEDïŒ-78ãã«
ã©ãºããªãŒãã€-$ 30
Edimax Wifi USB-8ãã«
LEDã¹ããªããã®ãã¬ãŒã ã®3Då°å·-PLAãã©ã¹ããã¯ããã15ãã«
ã©ã³ããããŒ-35ãã«
åèšã§ã補åã®ç·ã³ã¹ãã¯ãèªå® ã§ã®è£œé ã«çŽ200ç±³ãã«ã§ããã
ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã ã質åãããå Žåã¯ãã³ã¡ã³ãã§ãæ°è»œã«ãåãåãããã ããã