首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新-通过Atlas科学硬件串口扩展器连接到Arduino Uno的传感器问题8:1

更新-通过Atlas科学硬件串口扩展器连接到Arduino Uno的传感器问题8:1
EN

Stack Overflow用户
提问于 2021-01-20 06:42:02
回答 1查看 152关注 0票数 0

硬件连接以及与传感器(GPS NEO-6M模块、ESP8266等)的编程问题通过Atlas科学串口扩展器连接Arduino Uno 8:1

硬件:

  1. Arduino Uno
  2. 科学串口扩展器8:1
  3. GPS NEO-6M模块
  4. ESP8266 Wifi模块

Arduino Uno到GPS模块我们可以得到纬度和经度值,下面是相同的代码:

代码语言:javascript
运行
复制
#include <SoftwareSerial.h>
#include <TinyGPS.h>

long lat, lon;
SoftwareSerial gpsSerial(6, 5);
TinyGPS gps;

void setup() {
  Serial.begin(9600);
  gpsSerial.begin(9600);
}

void loop() {
  while (gpsSerial.available()) {
    if (gps.encode(gpsSerial.read())) {
      gps.get_position(&lat, &lon);
      Serial.print("Position:");
      Serial.print("lat:"); Serial.print(lat); Serial.print(" ");
      Serial.print("long:"); Serial.println(lon);
    }
  }
}

我们的要求是我们有四个传感器需要连接到一个Arduino Uno。为此,我们使用了阿特拉斯科学硬件串口扩展8:1。

下面是我们正在获取GPS坐标的代码:

代码语言:javascript
运行
复制
#include <SoftwareSerial.h> // we have to include the SoftwareSerial library, or else we can't use it

#define rx 8 // define what pin rx is going to be
#define tx 9 // define what pin tx is going to be

SoftwareSerial mySerial(rx, tx); //define how the soft serial port is going to work
    
int s1 = 6; // Arduino pin 6 to control pin S1
int s2 = 5; // Arduino pin 5 to control pin S2
int s3 = 4; // Arduino pin 4 to control pin S3
    
const uint8_t module_count = 8; // number of modules connected to the serial port expander 1=Port1, 2= Port2 and so on
    
void setup() {
  Serial.begin(115200); // Set the hardware serial port to 115200
  mySerial.begin(9600); // Set baud rate for the software serial port to 9600
    
  pinMode(s1, OUTPUT);  // Set the digital pin as output
  pinMode(s2, OUTPUT);  // Set the digital pin as output
  pinMode(s3, OUTPUT);  // Set the digital pin as output
}
    
void loop() {
  if (Serial.available()) { // if we get data from the computer
    char c = Serial.read();
    for (uint8_t i = 1; i <= module_count; i++) { // loop through the modules
      Serial.print("Connecting to Port: ");
      Serial.println(i);
      open_port(i);               // open the port
      mySerial.print(c);          // print character to port
      delay(100);                 // insert a delay to wait for the reply
      if (mySerial.available()) { // print reply to serial monitor
        while (mySerial.available()) {
          Serial.println(mySerial.read());
          if (gps.encode(mySerial.read())) {
            gps.get_position(&lat, &lon);
            Serial.print("Position:");
            Serial.print("lat:"); Serial.print(lat);
            Serial.print(" ");
            Serial.print("long:"); Serial.println(lon);
          }
        }
      }
      else {
        Serial.print("No response received");
      }
      Serial.println();
    }
  }
}

    void open_port(uint8_t _port) {                                  //this function controls what port is opened on the serial port expander
    
      if (_port < 1 || module_count > 8)_port = 1;                //if the value of the port is within range (1-8) then open that port. If it's not in range set it to port 1
      uint8_t port_bits = _port - 1;
    
      digitalWrite(s1, bitRead(port_bits, 0));               //Here we have two commands combined into one.
      digitalWrite(s2, bitRead(port_bits, 1));               //The digitalWrite command sets a pin to 1/0 (high or low)
      digitalWrite(s3, bitRead(port_bits, 2));               //The bitRead command tells us what the bit value is for a specific bit location of a number
      delay(2);                                         //this is needed to make sure the channel switching event has completed
    }

请指导我们整理这个问题;我们对gps.encode(mySerial.read())有一个问题。

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2021-01-25 10:33:44

问题是我们自己解决的,下面是相同的工作代码,

代码语言:javascript
运行
复制
#include <SoftwareSerial.h>                           //we have to include the SoftwareSerial library, or else we can't use it
#define rx 3                                         //define what pin rx is going to be
#define tx 2                                          //define what pin tx is going to be
SoftwareSerial mySerial(rx, tx);                      //define how the soft serial port is going to work
#include <TinyGPS.h>
#include <NMEAGPS.h>
int s1 = 6;                                           //Arduino pin 6 to control pin S1
int s2 = 5;                                           //Arduino pin 5 to control pin S2
int s3 = 4;                                           //Arduino pin 4 to control pin S3
int i;
const uint8_t module_count = 8;                       //number of modules connected to the serial port expander 1=Port1, 2= Port2 and so on
TinyGPS  gps;
gps_fix fix;
long lat, lon;

void setup() {
  Serial.begin(9600);                                 //Set the hardware serial port to 115200
  mySerial.begin(9600);                               //set baud rate for the software serial port to 9600

  pinMode(s1, OUTPUT);                                //Set the digital pin as output
  pinMode(s2, OUTPUT);                                //Set the digital pin as output
  pinMode(s3, OUTPUT);                                //Set the digital pin as output

}

void loop() {
  if (Serial.available()) {                           //if we get data from the computer
    char c = Serial.read();
    for (uint8_t i = 1; i <= module_count; i++) {    // loop through the modules
      Serial.print("Connecting to Port: ");
      Serial.println(i);
      open_port(i);                                  // open the port
      Serial.print(c);                             //print character to port
      delay(1000);                                    //insert a delay to wait for the reply
      //Serial.println(Serial.available());
      if (Serial.available()) {
        //Serial.println(gps.available(Serial));//print reply to serial monitor
        while (Serial.available()) {
          //Serial.write(mySerial.read());
          //Serial.write(gps.encode(mySerial.read()));
          //Serial.println(mySerial.available());
          //Serial.println(gps.encode(mySerial.read()));
          if (mySerial.available()>0) {
            //Serial.println(gps.encode(mySerial.read()));
            char d = byte(mySerial.read());
            //Serial.println(d);
            if (gps.encode(d)) {
              gps.get_position(&lat, &lon);
              Serial.print("Position:");
              Serial.print("lat:"); Serial.print(lat); Serial.print(" ");
              Serial.print("long:"); Serial.println(lon);
            }
          }

        }
        Serial.println();
      }
    }
  }
}




void open_port(uint8_t _port) {                                  //this function controls what port is opened on the serial port expander

  if (_port < 1 || module_count > 8)_port = 1;                //if the value of the port is within range (1-8) then open that port. If it's not in range set it to port 1
  uint8_t port_bits = _port - 1;

  digitalWrite(s1, bitRead(port_bits, 0));               //Here we have two commands combined into one.
  digitalWrite(s2, bitRead(port_bits, 1));               //The digitalWrite command sets a pin to 1/0 (high or low)
  digitalWrite(s3, bitRead(port_bits, 2));               //The bitRead command tells us what the bit value is for a specific bit location of a number
  delay(2);                                         //this is needed to make sure the channel switching event has completed
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65804300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档