JSN-SR04T не работают

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Ночи доброй госпада, есть сей скетч, все вроде бы хорошо, но не работают УЗ датчики 3 штуки, может в скетче где ошибка, датчики рабочие. Может кто поможет найти ошибку? Суть по срабатыванию 3х УЗ датчиков, запускаються таймеры.

#include <Ethernet.h>
#include <SPI.h>
#include <RTC.h>
#include <SD.h>


#define Relay_1_pin 38
#define Relay_2_pin 40
#define Relay_3_pin 42
#define Relay_4_pin 44
#define Relay_5_pin 46
#define Relay_6_pin 48
#define ResetPin 50

#define REQ_BUF_SZ 30
char HTTP_req[REQ_BUF_SZ] = {
  0};
char req_index = 0;

RTC time;

long dist_1;
long dist_2;
long dist_3;

int current_minute;
int start_second;

byte r1;
byte r2;
byte r3;
byte r4;
byte r5;
byte r6;

byte minute_tick=0;
byte cycle_stage=1;

bool r1_state;
bool r2_state;
bool r3_state;
bool r4_state;
bool r5_state;
bool r6_state;

bool log_written=false;

bool SD_card;
bool iswork = false;
int value;

File myFile;

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 10);
EthernetServer server(80);

void setup() {
  Serial.begin(9600);
  time.begin(RTC_DS1307);
  Ethernet.begin(mac, ip);
  server.begin();
  if (SD.begin(4)) {
    Serial.println("SD init done");
    SD_card = true;
  }
  else {
    Serial.println("SD init failed");
    SD_card = false;
  }
  if (SD.exists("log.txt")) {
    Serial.println("Log file exist");
    myFile = SD.open("log.txt", FILE_WRITE);
    if (myFile) {
      myFile.print("Controller ON in ");
      myFile.println(time.gettime("d-m-Y,  H:i:s"));
      myFile.close();
    }
  }
  else {
    Serial.println("Log file doesn't exist... Trying to create");
    Serial.println("Creating log.txt...");
    myFile = SD.open("log.txt", FILE_WRITE);
    if (myFile) {
      myFile.print("Controller ON in ");
      myFile.println(time.gettime("d-m-Y,  H:i:s"));
    }
    myFile.close();
    if (SD.exists("log.txt")) {
      Serial.println("Log file Created");
      SD_card = true;
    }
    else {
      Serial.println("Can't create file. Unknown error. Leaving procedure");
      SD_card = false;
    }
  }
  current_minute = atoi(time.gettime("i"));

  pinMode(22, INPUT);
  pinMode(24, OUTPUT);
  pinMode(26, INPUT);
  pinMode(28, OUTPUT);
  pinMode(30, INPUT);
  pinMode(32, OUTPUT);
  pinMode(Relay_1_pin, OUTPUT);
  pinMode(Relay_2_pin, OUTPUT);
  pinMode(Relay_3_pin, OUTPUT);
  pinMode(Relay_4_pin, OUTPUT);
  pinMode(Relay_5_pin, OUTPUT);
  pinMode(Relay_6_pin, OUTPUT);
  r1 = 1;
  r1_state = false;
  r2 = 1;
  r2_state = false;
  r3 = 1;
  r3_state = false;
  r4 = 1;
  r4_state = false;
  r5 = 1;
  r5_state = false;
  r6 = 1;
  r6_state = false;
}

void loop() {
start_mark:
  if (iswork) {
    if (atoi(time.gettime("i")) != current_minute && atoi(time.gettime("s")) == start_second) {
      current_minute = atoi(time.gettime("i"));
      Serial.print("A minute passed.. Current_minute is ");
      Serial.println(current_minute);
      delay(500);
      minute_tick++;
    }
    if (cycle_stage==1){
            if(r1==0) {
        cycle_stage=2;
        goto start_mark;
      }
      if(!log_written){
        log_insert(1, true);
        log_written=true;
      }
      r1_state=true;
      if (minute_tick==r1){
        r1_state=false;
        log_insert(1, false);
        log_written=false;
        cycle_stage=2;
        minute_tick=0;
      }
    }
    if (cycle_stage==2){
            if(r2==0) {
        cycle_stage=3;
        goto start_mark;
      }
      if(!log_written){
        log_insert(2, true);
        log_written=true;
      }
      r2_state=true;
      if (minute_tick==r2){
        r2_state=false;
        log_insert(2, false);
        log_written=false;
        cycle_stage=3;
        minute_tick=0;
      }
    }
    if (cycle_stage==3){
            if(r3==0) {
        cycle_stage=4;
        goto start_mark;
      }
      if(!log_written){
        log_insert(3, true);
        log_written=true;
      }
      r3_state=true;
      if (minute_tick==r3){
        r3_state=false;
        log_insert(3, false);
        log_written=false;
        cycle_stage=4;
        minute_tick=0;
      }
    }
    if (cycle_stage==4){
            if(r4==0) {
        cycle_stage=5;
        goto start_mark;
      }
      if(!log_written){
        log_insert(4, true);
        log_written=true;
      }
      r4_state=true;
      if (minute_tick==r4){
        r4_state=false;
        log_insert(4, false);
        log_written=false;
        cycle_stage=5;
        minute_tick=0;
      }
    }
    if (cycle_stage==5){
            if(r5==0) {
        cycle_stage=6;
        goto start_mark;
      }
      if(!log_written){
        log_insert(5, true);
        log_written=true;
      }
      r5_state=true;
      if (minute_tick==r5){
        r1_state=false;
        log_insert(1, false);
        log_written=false;
        cycle_stage=6;
        minute_tick=0;
      }
    }
    if (cycle_stage==6){
      if(r6==0) {
        cycle_stage=1;
        goto start_mark;
      }
      if(!log_written){
        log_insert(6, true);
        log_written=true;
      }
      r6_state=true;
      if (minute_tick==r6){
        r1_state=false;
        log_insert(6, false);
        log_written=false;
        cycle_stage=1;
        minute_tick=0;
        iswork=false;
        myFile = SD.open("log.txt");
        if (myFile) {
          myFile.print(time.gettime("d-m-Y,  H:i:s"));
          myFile.println(" Cycle end");
          myFile.close();
        }
      }
    }

  }
  else {
    dist_1 = request_dist(22, 24);
    Serial.print("dist_1 is ");
    Serial.println(dist_1);
    dist_2 = request_dist(26, 28);
    Serial.print("dist_2 is ");
    Serial.println(dist_2);
    dist_3 = request_dist(30, 32);
    Serial.print("dist_3 is ");
    Serial.println(dist_3);//echo, trigger
    if (dist_1 && dist_2 && dist_3 <= 26) {
      Serial.println("All of the distances is less than 5 sm, start work...");
      myFile = SD.open("log.txt");
      if (myFile) {
        myFile.print(time.gettime("d-m-Y,  H:i:s"));
        myFile.println(" All of distances is less than 5 sm, cycle start...");
        myFile.close();
      }
      iswork = true;
      r1_state = true;
      start_second = atoi(time.gettime("s"));
    }
  }

  //==========================SERVER=================================

  EthernetClient client = server.available();
  if (client) {
    //Serial.println("New client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (req_index < (REQ_BUF_SZ - 1)) {
          HTTP_req[req_index] = c; // save HTTP request character
          req_index++;
        }
        if (c == '\n' && currentLineIsBlank) {
          if (StrContains(HTTP_req, "GET /set?")) {
            int var = HTTP_req[10] - '0';
            //GET /set?r2_input?123?
            char buf[10];
            byte step_pch = 0;
            char * pch = strtok(HTTP_req, "?");
            while (pch != NULL) {
              pch = strtok(NULL, "?");
              step_pch++;
              if (step_pch == 1) {
                value = atoi(strtok(NULL, "?"));
                Serial.println(value);
                break;
              }
            }
            switch (var) {
            case 1:
              r1 = value;
              Serial.println("case 1");
              break;
            case 2:
              r2 = value;
              Serial.println("case 2");
              break;
            case 3:
              r3 = value;
              Serial.println("case 3");
              break;
            case 4:
              r4 = value;
              Serial.println("case 4");
              break;
            case 5:
              r5 = value;
              Serial.println("case 5");
              break;
            case 6:
              r6 = value;
              Serial.println("case 6");
              break;
            }
            client.print("OK");
            goto exit_mark;
          }
          if (StrContains(HTTP_req, "GET /ajax")) {
            client.print(r1_state);
            client.print("?");
            client.print(r2_state);
            client.print("?");
            client.print(r3_state);
            client.print("?");
            client.print(r4_state);
            client.print("?");
            client.print(r5_state);
            client.print("?");
            client.print(r6_state);
            client.print("?");
            client.print(r1);
            client.print("?");
            client.print(r2);
            client.print("?");
            client.print(r3);
            client.print("?");
            client.print(r4);
            client.print("?");
            client.print(r5);
            client.print("?");
            client.print(r6);
            client.print("?");
            if (iswork) {
              client.print("Работает");
            }
            else {
              client.print("Ожидает срабатывания датчиков расстояния");
            }
            client.print("?");
            client.print(time.gettime("d-m-Y H:i:s"));
            goto exit_mark;
          }
          //if (StrContains())
          if (StrContains(HTTP_req, "GET / ")) {
            Serial.println("html request");
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connnection: close");
            client.println();
            myFile = SD.open("relay.htm");
            if (myFile) {
              while (myFile.available()) {
                client.write(myFile.read()); // send web page to client
              }
              myFile.close();
            }
          }
          else if (StrContains(HTTP_req, "GET /relay.css")) {
            Serial.println("css request");
            myFile = SD.open("relay.css");
            if (myFile) {
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: text/css");
              client.println("Connnection: close");
              client.println();
              if (myFile) {
                while (myFile.available()) {
                  client.write(myFile.read()); // send web page to client
                }
                myFile.close();
              }
            }
          }
exit_mark:
          req_index = 0;
          StrClear(HTTP_req, REQ_BUF_SZ);
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
  digitalWrite(Relay_1_pin, r1_state);
  digitalWrite(Relay_2_pin, r2_state);
  digitalWrite(Relay_3_pin, r3_state);
  digitalWrite(Relay_4_pin, r4_state);
  digitalWrite(Relay_5_pin, r5_state);
  digitalWrite(Relay_6_pin, r6_state);
  if (digitalRead(ResetPin)) {
    iswork=false;
    r1=0;
    r2=0;
    r3=0;
    r4=0;
    r5=0;
    r6=0;
  }
}//loop


long request_dist(int echo, int trigger) {
  digitalWrite(trigger, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  long duration = pulseIn(echo, HIGH);
  long distance_cm = duration /58;
  return distance_cm;
  
}

void log_insert(byte relay, bool state) {
  Serial.println("Inserting to log...");
  myFile.close();
  myFile = SD.open("log.txt", FILE_WRITE);
  if (myFile) {
    Serial.print(time.gettime("d-m-Y, H:i:s"));
    if (state) {
      Serial.print(" Relay ");
      Serial.print(relay);
      Serial.println(" HIGH");
    }
    else {
      Serial.print(" Relay ");
      Serial.print(relay);
      Serial.println(" LOW");
    }
    myFile.print(time.gettime("d-m-Y, H:i:s"));
    if (state) {
      myFile.print(" Relay ");
      myFile.print(relay);
      myFile.println(" HIGH");
    }
    else {
      myFile.print(" Relay ");
      myFile.print(relay);
      myFile.println(" LOW");
    }
    myFile.close();
    Serial.println("Inserting to log file done...");
    SD_card = true;
  }
  else {
    Serial.println("Can't open file, ERROR");
    SD_card = false;
  }
}


void StrClear(char *str, char length)
{
  for (int i = 0; i < length; i++) {
    str[i] = 0;
  }
}

char StrContains(char *str, const char *sfind)
{
  char found = 0;
  char index = 0;
  char len;

  len = strlen(str);
  if (strlen(sfind) > len) {
    return 0;
  }
  while (index < len) {
    if (str[index] == sfind[found]) {
      found++;
      if (strlen(sfind) == found) {
        return 1;
      }
    }
    else {
      found = 0;
    }
    index++;
  }
  return 0;
}

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Про дефайнил порты, но все равно все мертво, датчики не стартуют. Может кто знает в чем может быть беда бедовая?

#define trigPin1 24
#define echoPin1 22
#define trigPin2 28
#define echoPin2 26
#define trigPin3 32
#define echoPin3 30
 pinMode(echoPin1, INPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(trigPin3, OUTPUT);
long request_dist(int echoPin, int trigPin) {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn(echoPin, HIGH);
  long distance_cm = duration /58;
  return distance_cm;

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Сорян, проблема решина, узкие глаза перепутали Trig c Echo

Japar
Offline
Зарегистрирован: 28.05.2016

Подскажите пожалуйста, а зачем использовали три ультразвуковых датчика?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Выполнение действий , при соблюдении 3х одинаковых дистанций.

Japar
Offline
Зарегистрирован: 28.05.2016

аа, понятно. Я вот тоже столкнулся с определенными трудностями, хочу использовать данный датчик в качестве ростомера, но вот значения показывают не всегда верные, случайно не знаете почему?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Точно не знаю сам шаманил. Скорее всего думаю что на плате, какие то детали не по номиналу стоят