質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2493閲覧

ラズパイのsleep関数の精度について

morita05041984

総合スコア3

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/12/31 00:06

pythonのsleep関数の精度について質問です。

LEDを点灯させて2分後に停止するプログラムをsleep,およびtimesleepを使っておこないましたが、1分30秒くらいで止まってしまいます。

いずれは30分後に停止するとかの、プログラムをくみたいのですが、なにか精度を上げる方法はないでしょうか?

調べたところによるとOSの設定を変更すると良いとの記事もみましたが、それで精度があがるのでしたら、Linuxの設定方法のなにかしらの変更の仕方をご教授いただけないでしょうか。

宜しく御願い申し上げます

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

解決したようですが。

NTPで時刻合わせしているとかですと話は変わりますが、でない場合は基盤のclockをカウントしているので、その周波数の安定性や精度によります。発振器周りの部品の温度でも変わりますし。
ので、
私がやるとすると、
通常運転レベルに基盤が温まってから、
何回か 設定 と 実際 の値を取り、
らしき補正係数を求めて
希望時間x補正係数 で設定します

投稿2021/12/31 01:41

winterboum

総合スコア23401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morita05041984

2021/12/31 01:50

ご回答ありがとうございます。
guest

0

ご回答ありがとうございます!

カレンダの時刻を読んで、そこから希望の時刻に停止させればいいかと。
↑たしかにそれも一つの方法のですね!

できれば時刻を設定せずに、タイマー的な感じでテキストボックスに数字をいれて、その任意の分数後に停止させたいのですが!

いま現状、30分設定しても26分で停止してしまってます…。

index.html

1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>WebIOPi | Light Control</title> 6 <script type="text/javascript" src="/webiopi.js"></script> 7 <script type="text/javascript"> 8 webiopi().ready(function() { 9 // Following function will process data received from set/getLightHours macro. 10 var updateLightHours = function(macro, args, response) { 11 var hours = response.split(";"); 12 // Following lines use jQuery functions 13 $("#inputOn").val(hours[0]); 14 $("#inputOff").val(hours[1]); 15 } 16 17 // Immediately call getLightHours macro to update the UI with current values 18 // "getLightHours" refers to macro name 19 // [] is an empty array, because getLightHours macro does not take any argument 20 // updateLightHours is the callback function, defined above 21 webiopi().callMacro("getLightHours", [], updateLightHours); 22 23 // Create a button to call setLightHours macro 24 var sendButton = webiopi().createButton("sendButton", "Send", function() { 25 // Arguments sent to the macro 26 var hours = [$("#inputOn").val(), $("#inputOff").val()]; 27 // Call the macro 28 webiopi().callMacro("setLightHours", hours, updateLightHours); 29 }); 30 31 // Append the button to the controls box using a jQuery function 32 $("#controls").append(sendButton); 33 34 // Create a "Light" labeled button for GPIO 17 35 var button = webiopi().createGPIOButton(17, "Light"); 36 37 // Append the button to the controls box 38 $("#controls").append(button); 39 40 // Refresh GPIO buttons 41 // pass true to refresh repeatedly of false to refresh once 42 webiopi().refreshGPIO(true); 43 44 }); 45 </script> 46 47<style type="text/css"> 48 button { 49 display: block; 50 margin: 5px 5px 5px 5px; 51 width: 160px; 52 height: 45px; 53 font-size: 24pt; 54 font-weight: bold; 55 color: white; 56 } 57 58 #gpio17.LOW { 59 background-color: Black; 60 } 61 62 #gpio17.HIGH { 63 background-color: Blue; 64 } 65 </style> 66 67</head> 68<body> 69 70<div align="center"> 71稼働時間を入力してください<input type="text" id="inputOn" /> 72 73 74<div id="controls"></div> 75 76</div> 77 78</body> 79</html>

script.py

1import webiopi 2import RPi.GPIO as GPIO 3import time 4 5 6 7 8 9GPIO = webiopi.GPIO 10 11LIGHT = 17 # GPIO pin using BCM numbering 12 13HOUR_ON = 0 # Turn Light ON at 08:00 14HOUR_OFF = 0 # Turn Light OFF at 18:00 15 16# setup function is automatically called at WebIOPi startup 17def setup(): 18 # set the GPIO used by the light to output 19 GPIO.setFunction(LIGHT, GPIO.OUT) 20 21 22 23# loop function is repeatedly called by WebIOPi 24def loop(): 25 # retrieve current datetime 26 for i in range(1): 27 GPIO.output(LIGHT, GPIO.HIGH) # LED on 28 time.sleep(0) 29 GPIO.output(LIGHT, GPIO.LOW) # LED off 30 time.sleep(HOUR_ON + 10) 31 32 33 34 35# destroy function is called at WebIOPi shutdown 36def destroy(): 37 GPIO.digitalWrite(LIGHT, GPIO.LOW) 38 39@webiopi.macro 40def getLightHours(): 41 return "%d;%d" % (HOUR_ON, HOUR_OFF) 42 43@webiopi.macro 44def setLightHours(on, off): 45 global HOUR_ON, HOUR_OFF 46 HOUR_ON = int(on) 47 HOUR_OFF = int(off) 48 return getLightHours()

こちらがコードです。
初めてだらけで何が何だかわかりませんが、一応sheepの引数には変数を置いておき、変数にユーザが任意の分数をテキストボックスにいれて時間を設定するプログラムを書いたつもりですが、おかしいところありますか??

投稿2021/12/31 01:28

編集2021/12/31 01:50
morita05041984

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/12/31 01:36

さすがにその時間精度はなにかコードが間違ってるんじゃ、とはおもいますが。
morita05041984

2021/12/31 01:38

やはりそうですか!すみません!帰宅後またご相談させて下さい!
y_waiwai

2021/12/31 03:47

そのsleep関数を実行する際に、引数の数値をプリントアウトするかログに出力するとかして確認してみては。
guest

0

ベストアンサー

カレンダの時刻を読んで、そこから希望の時刻に停止させればいいかと。

あなたの求める時刻精度がどれだけのもんかはわかりませんが、Linux(やWindows)などのOS下で、時間精度を求めるのは土台無理なはなしかとおもいます。

投稿2021/12/31 00:12

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問