Самодельный энкодер на датчиках FC-33
- Войдите на сайт для отправки комментариев
Втр, 15/05/2018 - 12:44
Доброго всем дня!
Смастерил вот такую хреновину (фото ниже). Она расположена на валу шторы и должна считать количество оборотов (вернее каждую восьмую часть оборота) и понимать направление вращения вала. Датчики - 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);
}
Обороты считает, но в любом направлении и бывает проскакиват парочку,а надо как писал выше.
Нужна ваша помощь или может где-то видели готовый пример
Нужна ваша помощь или может где-то видели готовый пример
Нужна ваша помощь или может где-то видели готовый пример
А нужна ли эта помощь в вашем баловстве. Баловаться можно и без помогальщиков.
А нужна ли эта помощь в вашем баловстве. Баловаться можно и без помогальщиков.
Спасибо, переделал диск - всё работает.
Ещё раз спасибо.
На ардуино нано всё работало прекрасно, потставил дома на место, там 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 - стоп, перезагрузка, потом опять работает, откидывал пины на прерывание - тогда все нормально. Подскажите, в чём может быть дело?