Самодельный энкодер на датчиках FC-33

Unreal334
Offline
Зарегистрирован: 03.04.2015

Доброго всем дня!

Смастерил вот такую хреновину (фото ниже). Она расположена на валу шторы и должна считать количество оборотов (вернее каждую восьмую часть оборота) и понимать направление вращения вала. Датчики - FC-33.

Например в крайнем верхнем положении (штора поднята) счетчик - 0, когда штора опускается счетчик плюсует обороты, когда поднимается минусует до нуля и останавливается.

Нашел пример кода, немного доработал, но что-то не получается (с программированием пока ещё беда))

int sensor01;
int sensor02;
int turn; // целый оборот вала
int stepOld;
int step;

long PulseCount;

#define SENSOR_A 3
#define SENSOR_B 2

void checkState() {

  sensor01 = digitalRead(SENSOR_A); // 0 - засвет горит светодиод 1 - закрыт не горит
  sensor02 = digitalRead(SENSOR_B);

  if (sensor01 == 1 && sensor02 == 1) {
    step = 0;
    if (stepOld == 1) {
      PulseCount++;
    }
    if (stepOld == 2) {
      PulseCount--;
    }
    stepOld = 0;
  }

  if (sensor01 == 1 && sensor02 == 0) {
    step = 1;
    if (stepOld == 1) {
      PulseCount++;
    }
    if (stepOld == 0) {
      PulseCount--;
    }
    stepOld = 1;
  }

  if (sensor01 == 0 && sensor02 == 1) {
    step = 2;
    if (stepOld == 2) {
      PulseCount++;
    }
    if (stepOld == 1) {
      PulseCount--;
    }
    stepOld = 2;
  }

}

void setup() {

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);

  PulseCount = 0;
  Serial.begin(115200);
}

void loop() {

  turn = (PulseCount / 8);

/*  if (PulseCount > -1) {

  }

  if (PulseCount < 10 && PulseCount > -10) {

  }

  if (PulseCount < 100 && PulseCount > -100) {

  }
*/

  Serial.print("stepOld: ");
  Serial.println(stepOld);
  Serial.print("turn: ");
  Serial.println(turn);
  Serial.print("step: ");
  Serial.println(step);
  Serial.print("sensor01: ");
  Serial.println(sensor01);
  Serial.print("sensor02: ");
  Serial.println(sensor02);
  Serial.print("PulseCount: ");
  Serial.println(PulseCount);

}

Обороты считает, но в любом направлении и бывает проскакиват парочку,а надо как писал выше.

Нужна ваша помощь или может где-то видели готовый пример

Unreal334
Offline
Зарегистрирован: 03.04.2015

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Unreal334 пишет:
Нашел пример кода, немного доработал, но что-то не получается (с программированием пока ещё беда))

Нужна ваша помощь или может где-то видели готовый пример

  У вас беда не только с программированим. А и вообще с пониманием  ..., а в часности с пониманием, как должно работать устройство.

Unreal334
Offline
Зарегистрирован: 03.04.2015

qwone пишет:

Unreal334 пишет:
Нашел пример кода, немного доработал, но что-то не получается (с программированием пока ещё беда))

Нужна ваша помощь или может где-то видели готовый пример

  У вас беда не только с программированим. А и вообще с пониманием  ..., а в часности с пониманием, как должно работать устройство.

Поэтому и прошу помощи

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А нужна ли эта помощь в вашем баловстве. Баловаться можно и без помогальщиков.

Unreal334
Offline
Зарегистрирован: 03.04.2015

qwone пишет:

А нужна ли эта помощь в вашем баловстве. Баловаться можно и без помогальщиков.

Баловство баловству рознь :)

Спасибо, переделал диск - всё работает.

Ещё раз спасибо.

Unreal334
Offline
Зарегистрирован: 03.04.2015

На ардуино нано всё работало прекрасно, потставил дома на место, там NodeMCU, появились перезагрузки NodeMCU. 

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <PubSubClient.h>

String A1, T1, T2, G1, G2, G3, G4, G5, G6, V1;
int UrovenSvetaBalkon, GerkonBalkonHigh, GerkonBalkonMiddle, GerkonBalkonLow, BalkonButtonUp, BalkonButtonStop, BalkonButtonDown, MoveBalkon;
float TempBalkonOut, TempBalkonIn;
long unsigned int valBut = 0;

int PowerRelePin = D1;  //D5
int UpRelePin = 13;     //D7
int DownRelePin = D2;   //D6

int sensor01, sensor02, stepOld, step;
long PulseCount;
const byte SENSOR_A = D5;
const byte SENSOR_B = D6;

void checkState(){
  
  sensor01 = digitalRead(SENSOR_A); // 0 - засвет горит светодиод 1 - закрыт не горит
  sensor02 = digitalRead(SENSOR_B);

  if(sensor01 == 1 && sensor02 == 1){
    step = 0;
    if(stepOld == 1){
      PulseCount--;
    }
    if(stepOld == 3){
      PulseCount++;
    }
    stepOld = 0;
  }

  if(sensor01 == 1 && sensor02 == 0){
    step = 1;
    if(stepOld == 2){
      PulseCount--;
    }
    if(stepOld == 0){
      PulseCount++;
    }
    stepOld = 1;
  }

  if(sensor01 == 0 && sensor02 == 0){
    step = 2;
    if(stepOld == 3){
      PulseCount--;
    }
    if(stepOld == 1){
      PulseCount++;
    }
    stepOld = 2;
  }

  if(sensor01 == 0 && sensor02 == 1){
    step = 3;
    if(stepOld == 0){
      PulseCount--;
    }
    if(stepOld == 2){
      PulseCount++;
    }
    stepOld = 3;
  }
}

long unsigned int previousMillis = 0;
long unsigned int TimePowerOnOff;
long unsigned int pause = 30000;
long unsigned int TimePush = 10;

const char* ssidHome = "*****";
const char* passwordHome = "*****";
const char* ssidWork = "*****";
const char* passwordWork = "******";
//const char* mqtt_server = "192.168.100.5";   // IP адрес MQTT сервер
//const char* ssidAP = "******";
//const char* passwordAP = "******";

IPAddress ipHome(192, 168, 100, 176); //Node static IP
IPAddress ipWork(192, 168, 0, 176); //Node static IP
IPAddress gatewayHome(192, 168, 100, 1);
IPAddress gatewayWork(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

WiFiClient espClient;
PubSubClient client(espClient);
ESP8266WebServer server(80);

void setup() {
  attachInterrupt(digitalPinToInterrupt (SENSOR_A), checkState, CHANGE);
  attachInterrupt(digitalPinToInterrupt (SENSOR_B), checkState, CHANGE);
  PulseCount = 0;
  
  pinMode(PowerRelePin, OUTPUT);
  digitalWrite(PowerRelePin, HIGH);
  pinMode(UpRelePin, OUTPUT);
  digitalWrite(UpRelePin, HIGH);
  pinMode(DownRelePin, OUTPUT);
  digitalWrite(DownRelePin, HIGH);
  Serial.begin(115200);
  WIFI_init();
  HTTP_init();
}

void loop() {
  client.loop();
  server.handleClient();
  delay(1);
}
String webPage();

По питанию должно быть всё номально 2,2А блок. Сбросы именно при работе, т.е. штора начала опускаться, секунд 5-10 - стоп, перезагрузка, потом опять работает, откидывал пины на прерывание - тогда все нормально. Подскажите, в чём может быть дело?