шаговый двигатель на али #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



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


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

Алмазная вышивка «Матрёшка с яблоками» (20 х 30 см) Стрелки на глазах пошагово в картинках

Шаговый двигатель на али Шаговый двигатель на али Шаговый двигатель на али Шаговый двигатель на али Шаговый двигатель на али Шаговый двигатель на али Шаговый двигатель на али