Закрыть ... [X]

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#include <EEPROM.h>

#include <Ticker.h>

#include "chuk.c"

const char ssid = "lleo-home-wifi";
const char password = "le,byeirf";
MDNSResponder mdns;

ESP8266WebServer server(80);

#define led  2
#define led2 16
#define INPUTKN 12
#define MOTO1 4
#define MOTO2 5
#define HALL 13
#define INP0 A0

#define AnalogReadBuffer_MAX 250
int AnalogReadBuffer_count=0;
unsigned int AnalogReadBuffer[AnalogReadBuffer_MAX];
unsigned int AnalogReadSTD[AnalogReadBuffer_MAX];
char INPUTKNRead[AnalogReadBuffer_MAX];

uint8_t A0_log=0;
uint8_t timer_blink=0; // Таймер http://www.pvsm.ru/arduino/111541
unsigned int T1_counter=0;
char motor_go=0;
char motor_upert=0;

  Ticker blinker;
  void timerIsr() { T1_counter++;
    if(!A0_log) return;
    digitalWrite(led,(timer_blink++)&1);
    if(AnalogReadBuffer_count<AnalogReadBuffer_MAX) {
      int x=analogRead(A0),y=FLT(x); if(y==2) motor_upert=1;
      INPUTKNRead[AnalogReadBuffer_count]=digitalRead(INPUTKN);
      AnalogReadBuffer[AnalogReadBuffer_count]=x;
      AnalogReadSTD[AnalogReadBuffer_count++]=y;
    }
  }

int i,pc=0;

// DATA in EEPROM

char motor_pos=1; // последняя позиция мотора
unsigned int Tugo200=250; // порог поворота
unsigned int Tugo500=500; // порог упора
unsigned int Skip500=200; // интервал оценки
unsigned int DelayOtPoroga=200; // задержка от порога
unsigned int DelayOtStarta=200; // задержка от старта
unsigned char MotorSide=1; // прямая-обратная установка в дверь
unsigned char motor_flag_stop=0;

unsigned int eeprom_count=0;
unsigned int eeprom_Tugo200=2; // 2б
unsigned int eeprom_Tugo500=4; // 2б
unsigned int eeprom_Skip500=6; //2,
unsigned int eeprom_DelayOtPoroga=8; //2,
unsigned int eeprom_DelayOtStarta=10; //2,
unsigned int eeprom_MotorSide=12; // 1
unsigned int eeprom_motor_pos=13; // 1

// EEPROM
int f_read(int i) { return EEPROM.read(i); }
int f_save(int i,unsigned char v) { EEPROM.write(i,v); EEPROM.commit(); EEPROM.end(); }
int f_read_int(int i) { return (EEPROM.read(i+1)<<8)+EEPROM.read(i); }
int f_save_int(int i,int v) { EEPROM.write(i+1,highByte(v)); EEPROM.write(i,lowByte(v)); EEPROM.commit(); EEPROM.end(); }

void motor(uint8_t x){
  if(!x) { digitalWrite(MOTO1,0); digitalWrite(MOTO2,0); motor_go=0; return; }
  if(x==1) { if(motor_pos>1) return; digitalWrite(MOTO1,1);digitalWrite(MOTO2,0); }
  else { if(motor_pos==0) return; digitalWrite(MOTO1,0);digitalWrite(MOTO2,1); }
  motor_go=(MotorSide==1)?x:-x;
  motor_upert=0; T1_counter=0; motor_flag_stop=0;
}

void handleRoot() {
  digitalWrite(led,1);
  String s="<!DOCTYPE html><html><head><title>LEOPOLD</title>";
s+="<style>RINPUT {padding:20px;}\n#er {color:red;}</style>";
s+="<script type='text/javascript' src='http://home.lleo.me/projects/arduino/rg.js'></script>";
s+="<script>";
s+="function clean(id){ if(idd(id)) setTimeout(\"var s=idd('\"+id+\"');if(s)s.parentNode.removeChild(s);\",40); }";
s+="function idd(id){ return typeof(document.getElementById(id))=='undefined'?false:document.getElementById(id); }";
s+="function idie(s){ var e=idd('buka'); e.innerHTML=e.innerHTML+s; }";
s+="function printmas(){ var s0=s1=s2='<p>',p=line.originalData,i; for(i in p) { s0+=p[0][i]+','; s1+=p[1][i]+','; s2+=p[2][i]+','; } idie('<hr>'+s0+s1+s2+'<hr>'); }";

s+="var RGON=0; function RG(a,b,kn){ if(a===false||RGON==0) return RGON=0;";
s+="  if(a.length) { for(var i in a) { var c=a[i]3+1,d=b[i]100+400,k=(kn[i]&1)100+850; if(c>1024)c=1024; if(d>1024)d=1024;";
s+="     line.originalData[0].unshift(c); line.originalData[0].pop(); line.originalData[1].unshift(d); line.originalData[1].pop(); line.originalData[2].unshift(k); line.originalData[2].pop();";
s+="} RGraph.SVG.redraw(); }";
s+="    setTimeout(\"AJAX('getlog')\",200);";
s+="}";

s+="function RG_init(){";
s+="line=new RGraph.SVG.Line({id:'rg',";
s+="data:[RGraph.SVG.arrayFill({array:[],value:0,length:300}),RGraph.SVG.arrayFill({array:[],value:0,length:300}),RGraph.SVG.arrayFill({array:[],value:0,length:300})],options: {";
s+="gutterLeft:40,yaxisMax:1024,yaxisMin:0,backgroundGridVlinesCount:30,filled:[true,false,false],\ncolors:['#c00','#00c','#0c0'],\nlinewidth:3,\nfilledColors:['rgba(255,0,0,0.25)','rgba(0,0,255,0.25)','rgba(0,255,0,0.25)'],\nshadow:true}}).draw();";
s+="}";

s+="function AJAX(x){\n";
s+="    var request=new XMLHttpRequest(); request.onreadystatechange=function(){ if(this.readyState==4 && this.status==200 && this.responseText!=null)";
s+="       try{eval(this.responseText);}catch(e){alert('Error Ajax');}";
s+="    }; request.open('GET',x+(/\&/.test(x)?'&':/\?/.test(x)?'':'?')+'rand='+Math.random(),true); request.send(null);";
s+="}\n";

s+="var m=[0,1,2,3,4,5,10,12,13,14,15,16],i; for(i in m) document.write((\" <input type=button value='PIN?n=#&on=1' onclick='bu(this)'> <input type=button value='PIN?n=#&on=0' onclick='bu(this)'>\").replace(/#/g,m[i]));";
s+="function bu(e) { AJAX(e.value); }";

s+="</script>";

s+="</head><body onload='RG_init();'>";

s+="<h1>LEOPOLD</h1>";

s+="<center><div style='width:95%;height:400px' id='rg'></div></center>";
s+="<div><input type=button value='A0_ON' onclick='bu(this)'>   <input type=button value='A0_OFF' onclick='RGON=0;bu(this)'></div>";
s+="<p><input type=button value='STOP' onclick='bu(this)'>     <input type=button value='MOTOL' onclick='bu(this)'>   <input type=button value='MOTOR' onclick='bu(this)'>";

s+="<p><input type=button value='OPEN' onclick='bu(this)'>     <input type=button value='CLOSE' onclick='bu(this)'>";

s+="   <input type=button value='PRINT' onclick='printmas()'>";

s+="<div id='er'></div><div id='buka'></div>";
s+="</body></html>";

  server.send(200,"text/html",s);
  digitalWrite(led,1);
}

void handleNotFound(){
  String s = "File Not Found\n\n";
  s += "URI: ";
  s += server.uri();
  s += "\nMethod: ";
  s += (server.method() == HTTP_GET)?"GET":"POST";
  s += "\nArguments: ";
  s += server.args();
  s += "\n";
  for (uint8_t i=0; i<server.args(); i++){ s += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
  server.send(404, "text/plain", s);
  digitalWrite(led,1);
}

void setup(void){

  pinMode(led, OUTPUT); digitalWrite(led,1);
  pinMode(led2, OUTPUT); digitalWrite(led2,1);

  pinMode(MOTO1,OUTPUT); digitalWrite(MOTO1,0);
  pinMode(MOTO2,OUTPUT); digitalWrite(MOTO2,0);

  pinMode(HALL,INPUT_PULLUP);

  pinMode(INPUTKN,INPUT_PULLUP);

  pinMode(INP0,INPUT);

  // pinMode(tuk, OUTPUT);

  Serial.begin(115200);

  Serial.println("RESET");

  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while(WiFi.status() != WL_CONNECTED) {
    digitalWrite(led,pc); pc=(!pc)&&1; digitalWrite(led2,pc); delay(200);
    Serial.print(".");
  }
  digitalWrite(led,1);
  digitalWrite(led2,0);

  Serial.println("");
  Serial.print("Server ESP #"); Serial.println(ESP.getChipId());
  Serial.print("Connected to "); Serial.println(ssid);
  Serial.print("IP address: "); Serial.println(WiFi.localIP());

  if(mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }

 server.on("/", handleRoot);

 server.on("/ping",[](){ server.send(200,"text/plain","OK");});

 server.on("/MOTOL",[](){ motor(1); server.send(200,"text/plain","idie('MOTOL<br>')"); Serial.println("MOTOR 1"); });
 server.on("/MOTOR",[](){ motor(-1); server.send(200,"text/plain","idie('MOTOFF<br>')"); Serial.println("MOTOR -1"); });

 server.on("/STOP",[](){ motor(0); server.send(200,"text/plain","idie('STOP<br>')"); Serial.println("MOTOR OFF");});

 server.on("/A0_ON",[](){ A0_log=1; AnalogReadBuffer_count=0; FLT_c=0;

// for(int c=0;c<10;c++) AnalogReadBuffer[AnalogReadBuffer_count++]=10;

 server.send(200,"text/plain","idie('A0_ON<br>'); RGON=1;RG([]);"); Serial.println("A0_ON"); });
 server.on("/A0_OFF",[](){ A0_log=0; digitalWrite(led,1); AnalogReadBuffer_count=0; server.send(200,"text/plain","idie('A0_OFF<br>'); RGON=0;"); Serial.println("A0_OFF"); });

 server.on("/getlog",[](){ if(!A0_log && AnalogReadBuffer_count) return server.send(200,"text/plain","RG(false);");
      String s="",d="",k=""; for(i=0;i<AnalogReadBuffer_count;i++) {
        s+=(i?",":"")+String(AnalogReadBuffer[i],DEC);
        d+=(i?",":"")+String(AnalogReadSTD[i],DEC);
        k+=(i?",":"")+String(INPUTKNRead[i],DEC);
      }
      AnalogReadBuffer_count=0;
      server.send(200,"text/plain","RG(["+s+"],["+d+"],["+k+"])");
 });

 server.on("/getset",[](){
   String s="clean('sform');idie(\"<form id='sform' action='/set'>";
   s+="<br>Max-do: <input name=Tugo200 value='"+String(Tugo200,DEC)+"'>";
   s+="<br>Max-end: <input name=Tugo500 value='"+String(Tugo500,DEC)+"'>";
   s+="<br>Skip: <input name=Skip500 value='"+String(Skip500,DEC)+"'>";
   s+="<br>Delay-do: <input name=DelayOtPoroga value='"+String(DelayOtPoroga,DEC)+"'>";
   s+="<br>Delay-start: <input name=DelayOtStarta value='"+String(DelayOtStarta,DEC)+"'>";
   s+="<br>Motor-side: <input name=MotorSide value='"+String(MotorSide,DEC)+"'>";
   s+="<p><input type=submit value='SAVE'></form>\");";
   server.send(200,"text/plain",s); Serial.println("OK");
  });

 server.on("/set",[](){
   i=server.arg("Tugo200").toInt(); if(i<50||i>400) { server.send(200,"text/plain","er('Error Max-do (50..400)')"); return; } Tugo200=i; // EEprom
   i=server.arg("Tugo500").toInt(); if(i<50||i>800) { server.send(200,"text/plain","er('Error Max-end (50..800)')"); return; } Tugo500=i; // EEprom
   i=server.arg("Skip500").toInt(); if(i<1||i>5000) { server.send(200,"text/plain","er('Error Skip (1..5000)')"); return; } Skip500=i; // EEprom
   i=server.arg("DelayOtPoroga").toInt(); if(i<50||i>800) { server.send(200,"text/plain","er('Error Delay-do (50..800)')"); return; } DelayOtPoroga=i; // EEprom
   i=server.arg("DelayOtStarta").toInt(); if(i<50||i>800) { server.send(200,"text/plain","er('Error Max do (50..800)')"); return; } DelayOtStarta=i; // EEprom
   i=server.arg("MotorSide").toInt(); if(i!=1&&i!=0) { server.send(200,"text/plain","er('Error Motor-side (0 or 1)')"); return; } MotorSide=i; // EEprom
   server.send(200,"text/plain","clean('sform')");
 });

 server.on("/PIN",[](){
    char i=server.arg("n").toInt(),on=server.arg("on").toInt();
    pinMode(i,OUTPUT); digitalWrite(i,on);
    String s="Pin #"+String(MotorSide,DEC)+" "+(on?"ON":"OFF");
    server.send(200,"text/plain","idie('"+s+"<br>')"); Serial.println(s);
 });

 // 


  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");

  blinker.attach(0.05,timerIsr);
  digitalWrite(led,1);
}

int top=0;
int an=0;

void loop(void){
  server.handleClient();

  if(motor_go) {
    an=0;
    if(an>400 || T1_counter>50) motor(0); // таймаут или адский ток
    else if(!motor_flag_stop && T1_counter<3) motor_upert=0; // первые заедания проезжаем
    else if(motor_upert) {
      if(motor_flag_stop) {
        if(T1_counter>13) motor(0); // выдержали паузу - и остановили
      } else { motor_flag_stop=1; T1_counter=0; } // сбросить счетчик и начать отсчет паузы для остановки
    }

} // else { if(digitalRead(HALL)==0) motor(1); }

}


Источник: http://lleo.me/dnevnik/2017/05/04.html


Поделись с друзьями



Рекомендуем посмотреть ещё:



Леонид Каганов: Вдогонку к вчерашнему посту про Хорошие краски для китайской росписи ногтей

Поделка старый замок Поделка старый замок Поделка старый замок Поделка старый замок Поделка старый замок Поделка старый замок Поделка старый замок Поделка старый замок

ШОКИРУЮЩИЕ НОВОСТИ