/*
* WiFi LED ON/OFF TEST
* PWM Control
*/
#include <WiFi.h>
#include "FS.h"
#include <SPIFFS.h>
#include <Ticker.h>
//#define DEBUG
const char* ssid = "hogehoge";
const char* password = "hogehogepaswd";
IPAddress ip(192, 168, 1, 32); // for fixed IP Address
IPAddress gateway(192,168, 1, 1); //
IPAddress subnet(255, 255, 255, 0); //
IPAddress DNS(192, 168, 1, 90); //
WiFiServer server(80);
String html_1;
String resp_1;
byte led_brightness = 0 ;
int val = 0 ;
char local_val[10]="checked" ;
char remote_val[10]="" ;
bool local = true ;
bool localen = false ;
Ticker ticker;
bool ticker_val = false ;
int vol_value = 0 ;
int loopcnt = 0;
void setup()
{
Serial.begin(115200);
SPIFFS.begin(); //SPIFFSを開始
pinMode(2, OUTPUT); // set the LED pin mode
WiFi.config(ip, gateway, subnet, DNS); // Set fixed IP address
delay(10);
// We start by connecting to a WiFi network -----------------------------
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
//index.htmlファイルの読み込み
File index1 = SPIFFS.open("/test_pwm_vol.html", "r");
if(!index1)
Serial.println("file open failed");
else{
html_1 = index1.readString(); //index.htmlをstringで読み込み
index1.close(); //ファイルを閉じる
}
//resp.htmlファイルの読み込み
File index2 = SPIFFS.open("/resp_slid.html", "r");
if(!index2)
Serial.println("file open failed");
else{
resp_1 = index2.readString(); //index.htmlをstringで読み込み
index2.close(); //ファイルを閉じる
}
// for LED PWM Control ---------------------------------------------------
ledcSetup(0, 5000, 13); // setup channel 0 with frequency 5000 Hz, 13 bit precission for LEDC timer
ledcAttachPin(2,0); // attach pin 2 to channel 0
ledcWrite(0, 0); // initialize channel 0 to off
// for Ticker
ticker.attach_ms(100, execTicker) ; // 割り込み間隔と割り込み処理を設定。
}
void loop(){
WiFiClient client = server.available(); // listen for incoming clients
int pos ;
int xhr ;
String cmd = "" ;
String htmlwk = "" ;
String respwk = "" ;
if (ticker_val) { // フラグが true だったら、処理を実行。
do_JOB() ;
}
if (client) { // if you get a client,
# ifdef DEBUG
Serial.println("***** Client access start *****"); // print a message out the serial port
#endif
xhr = 0 ;
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
String line = client.readStringUntil('\n'); // Get Line data until '\n'
# ifdef DEBUG
Serial.println(line);
#endif
if ((pos= line.indexOf("GET /?remote")) != -1) {
pos += 13 ;
while(line.charAt(pos) !=' ') {
cmd += line.charAt(pos++) ;
}
if (cmd=="local") {
local = true ;
ticker.attach_ms(100, execTicker) ; // 割り込み間隔と割り込み処理を設定。
strcpy(local_val,"checked") ;
strcpy(remote_val,"") ;
} else {
local = false ;
localen = false ;
ticker.detach() ;
strcpy(local_val,"") ;
strcpy(remote_val,"checked") ;
}
}
if ((pos= line.indexOf("GET /?pol")) != -1) {
xhr=1;
}
if ((pos= line.indexOf("GET /?slid")) != -1) {
pos += 11 ;
while((line.charAt(pos) >='0') & (line.charAt(pos) <='9')) {
cmd += line.charAt(pos++) ;
}
val = cmd.toInt() ;
if (val>256) val = 255 ;
led_brightness = (byte)val ;
xhr=1;
}
if ((pos= line.indexOf("GET /?led_v")) != -1) {
pos += 12 ;
while((line.charAt(pos) >='0') & (line.charAt(pos) <='9')) {
cmd += line.charAt(pos++) ;
}
val = cmd.toInt() ;
if (val>256) val = 255 ;
led_brightness = (byte)val ;
}
if ((pos=line.indexOf("GET /?on")) != -1) { // Client request was "GET /?on"
led_brightness += 1 ;
}
if ((pos=line.indexOf("GET /?off")) != -1) { // Client request was "GET /?off"
led_brightness = 0 ;
}
ledcWrite(0, 8191*led_brightness/255) ; // set PWM value to channel#0
if (line.length() == 1 && line[0] == '\r'){ // end of HTTP request
if (xhr == 0) {
htmlwk = html_1 ;
htmlwk.replace("$led_brightness",String(led_brightness)) ;
Serial.print("radio_local = ");
Serial.println(local);
Serial.print("brightness = ");
Serial.println(led_brightness);
htmlwk.replace("$checked_lo",local_val) ;
htmlwk.replace("$checked_rm",remote_val) ;
send_html(client,htmlwk) ; // send response to client
} else {
respwk = resp_1 ;
respwk.replace("$led_brightness",String(led_brightness)) ;
send_html(client,respwk) ; // send response to client
# ifdef DEBUG
Serial.print("xhr value :"); Serial.println(led_brightness);
#endif
}
break; // break while loop
}
}
}
delay(1); // give the web browser time to receive the data
// close the connection:
client.stop();
//
# ifdef DEBUG
Serial.println("Client Disconnected.");
Serial.println("--------------------------------------------------");
#endif
}
}
// ------------------------------------------------------------------
void send_html(WiFiClient client, String html ) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.print(html) ;
# ifdef DEBUG
Serial.println( " --- send html --- ");
#endif
}
void execTicker() {
ticker_val = true ; // フラグを True にする。
}
void do_JOB() {
// ... 実行したい処理 ...
vol_value = analogRead(A4);
if (localen == true) {
led_brightness = (byte) ((vol_value*255)/4095) ;
ledcWrite(0, 8191*led_brightness/255) ; // set PWM value to channel#0
} else if (vol_value == 0)
localen = true ;
loopcnt++ ;
if (loopcnt ==10) {
Serial.println("") ;
Serial.print( "A4 :") ; Serial.println(vol_value) ;
loopcnt = 0;
}
ticker_val = false ; // 処理を実行したら、フラグを false にする。
}
<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>
<style>
#base {font-size:16pt;text-align:center;width:300px;border:solid 4px #93ff93; }
#radio_box {font-size:12pt;float:left ;text-align:left; width:45%; }
#disp_box {font-size:12pt;float:right;text-align:left; width:50%; }
#brightness {font-size:12pt;text-align:right; }
#val_box {font-size:12pt;text-align:center; clear:both ;}
#ctl_box {text-align:center; }
input.radio {margin-left:8px; width:30px;}
input.value {margin-left:8px; width:30px;}
input.setbutton{margin-left:8px; width:40px;}
input.slider {margin-left:8px; width:250px;}
input.button {margin:0px 15px; width:100px;}
</style>
<title>Color LED Controller</title></head>
<body>
<div id="base">
<p>LED ON/OFF</p>
<div id="radio_box">
<form method="get">
<input class='radio' type='radio' name='remote' id="rad_lo" value='local' $checked_lo onclick='disp_ctrl(this.value); submit(this.value)'>local<br>
<input class='radio' type='radio' name='remote' id="rad_rm" value='remote' $checked_rm onclick='disp_ctrl(this.value); submit(this.value)'>remote<br>
</form>
</div>
<div id="disp_box">
<span> brightness value</span><br>
<div id="brightness"><output id="o1">$led_brightness</output></div>
</div>
<div id="val_box">
<form method="get">
<span style="font-size:10pt;"> LED brightness (0-255)</span>
<input class='value' type='text' name='led_v' value=$led_brightness id='led_v' disabled>
<input class='setbutton' type='submit' name='set' id='set' value='SET' disabled>
</form>
<form method='get'>
<input class="slider" type="range" name='led_s' id='led_s' value=$led_brightness min="0" max="255" step="1" disabled
onchange="setval(this.value);" oninput="setval(this.value)"; onmouseup="submit(this.form)": ontouchend="submit(this.form)">
</form>
</div>
<div id="ctl_box">
<form method='get'>
<input class='button' type='submit' name='on' id="on" value='ON' disabled >
<input class='button' type='submit' name='off' id="off" value='OFF' disabled><br>
</form>
</div>
</div>
<script>
var polling = null ;
function setval(ledval){
var xhr = new XMLHttpRequest();
xhr.open("get", "?slid="+ledval );
xhr.timeout = 2000 ;
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
xhr.responseType = 'document' ;
xhr.onreadystatechange = function() {
if( (xhr.readyState == 4) && (xhr.status == 200) ) {
document.getElementById('led_v').value = xhr.response.getElementById("output1").innerHTML;
document.getElementById('o1').innerHTML = xhr.response.getElementById("output1").innerHTML;
}
}
xhr.ontimeout = function(e) {
xhr.abort() ;
}
xhr.send();
}
function getval(){
var xhrget = new XMLHttpRequest();
xhrget.open("get", "?pol" );
xhrget.setRequestHeader('Cache-Control', 'no-cache');
xhrget.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
xhrget.responseType = 'document' ;
xhrget.onreadystatechange = function() {
if( (xhrget.readyState == 4) && (xhrget.status == 200) ) {
document.getElementById('o1').innerHTML = xhrget.response.getElementById("output1").innerHTML;
}
}
ntimeout = function(e) {
xhrget.abort() ;
}
xhrget.send();
}
function disp_ctrl( radioid ) {
if(radioid == 'remote') {
document.getElementById('led_v').disabled = false;
document.getElementById('set').disabled = false;
document.getElementById('led_s').disabled = false;
document.getElementById('on').disabled = false;
document.getElementById('off').disabled = false;
clearInterval(polling);
} else {
document.getElementById('led_v').disabled = true;
document.getElementById('set').disabled = true;
document.getElementById('led_s').disabled = true;
document.getElementById('on').disabled = true;
document.getElementById('off').disabled = true;
polling = setInterval(getval,100) ;
}
}
window.onload = function() {
if(document.getElementById("rad_rm").checked) {
document.getElementById('led_v').disabled = false;
document.getElementById('set').disabled = false;
document.getElementById('led_s').disabled = false;
document.getElementById('on').disabled = false;
document.getElementById('off').disabled = false;
clearInterval(polling);
} else if(document.getElementById("rad_lo").checked) {
document.getElementById('led_v').disabled = true;
document.getElementById('set').disabled = true;
document.getElementById('led_s').disabled = true;
document.getElementById('on').disabled = true;
document.getElementById('off').disabled = true;
polling = setInterval(getval,100) ;
}
}
</script>
</body>
</html>
<!DOCTYPE html><html lang='ja'>
<head> <title>Color LED Controller</title></head>
<html> <body>
<output id='output1'>$led_brightness</output>
</body> </html>
これのコピペで勉強中です。
返信削除少し質問ですが、ローカルVRに戻った時に入力が受付しません。
はじめは、VR抵抗値が高すぎるor接触で考えていましたが。
122行local = true ;の後にlocalen = true ;が必要では?
do_job処理は、入っているような? その後ifで蹴られているような?
すみません素人が、余分な指摘かも です。
ローカルにした時、ボリュームを '0' に戻さないとボリュームの値を反映しないようにしています。
削除vol_value ==0 で localen=true にしています。 (223,224行目)、