Skip to main content

Barometric pressure sensor with Arduino

Hardware Required
  • - Arduino or Genuino board
  • - SCP1000 Pressure Sensor Breakout Board
  • - hook-up wires 
  • Procedure 

Follow the circuit diagram and make the connections as shown in the image given below.

Arduino Code

/******* All the resources for this project: https://lihuo.blogspot.com*******/


The code below starts out by setting the SCP1000's configuration registers in the setup(). In the main loop, it sets the sensor to read in high resolution mode, meaning that it will return a 19-bit value, for the pressure reading, and 16 bits for the temperature. The actual reading in degrees Celsius is the 16-bit result divided by 20.  Then it reads the temperature's two bytes. Once it's got the temperature, it reads the pressure in two parts. First it reads the highest three bits, then the lower 16 bits. It combines these two into one single long integer by bit shifting the high bits then using a bitwise OR to combine them with the lower 16 bits. The actual pressure in Pascal is the 19-bit result divide by 4. 
const int PRESSURE = 0x1F;      //3 most significant bits of pressureconst int PRESSURE_LSB = 0x20;  //16 least significant bits of pressureconst int TEMPERATURE = 0x21;   //16 bit temperature readingconst byte READ = 0b11111100;     // SCP1000's read commandconst byte WRITE = 0b00000010;   // SCP1000's write command

// pins used for the connection with the sensor
// the other you need are controlled by the SPI library):
const int dataReadyPin = 10;
const int chipSelectPin = 11;

void setup() {
  Serial.begin(9600);
  SPI.begin();// start the SPI library

  /* initalize the  data ready and chip select pins:  */  pinMode(dataReadyPin, INPUT);
  pinMode(chipSelectPin, OUTPUT);

  /* Configure SCP1000 for low noise configuration: */  writeRegister(0x02, 0x2D);
  writeRegister(0x01, 0x03);
  writeRegister(0x03, 0x02);
  delay(100);// give the sensor time to set up
}

void loop() {
  //Select High Resolution Mode  writeRegister(0x03, 0x0A);

  // don't do anything until the data ready pin is high:  if (digitalRead(dataReadyPin) == HIGH) {
    //Read the temperature data    int tempData = readRegister(0x21, 2);

    // convert the temperature to celsius and display it:    float realTemp = (float)tempData / 20.0;
    Serial.print("Temp[C]=");
    Serial.print(realTemp);


    //Read the pressure data highest 3 bits:    byte  pressure_data_high = readRegister(0x1F, 1);
    pressure_data_high &= 0b00000111; //you only needs bits 2 to 0    //Read the pressure data lower 16 bits:    unsigned int pressure_data_low = readRegister(0x20, 2);
    //combine the two parts into one 19-bit number:    long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4;

    // display the temperature:    Serial.println("\tPressure [Pa]=" + String(pressure));
  }
}

//Read from or write to register from the SCP1000:unsigned int readRegister(byte thisRegister, int bytesToRead) {
  byte inByte = 0;           // incoming byte from the SPI  unsigned int result = 0;   // result to return  Serial.print(thisRegister, BIN);
  Serial.print("\t");
  // SCP1000 expects the register name in the upper 6 bits  // of the byte. So shift the bits left by two bits:  thisRegister = thisRegister << 2;
  // now combine the address and the command into one byte  byte dataToSend = thisRegister & READ;
  Serial.println(thisRegister, BIN);
  // take the chip select low to select the device:  digitalWrite(chipSelectPin, LOW);
  // send the device the register you want to read:  SPI.transfer(dataToSend);
  // send a value of 0 to read the first byte returned:  result = SPI.transfer(0x00);
  // decrement the number of bytes left to read:  bytesToRead--;
  // if you still have another byte to read:  if (bytesToRead > 0) {
    // shift the first byte left, then get the second byte:    result = result << 8;
    inByte = SPI.transfer(0x00);
    // combine the byte you just got with the previous one:    result = result | inByte;
    // decrement the number of bytes left to read:    bytesToRead--;
  }
  // take the chip select high to de-select:  digitalWrite(chipSelectPin, HIGH);
  // return the result:  return (result);
}


//Sends a write command to SCP1000void writeRegister(byte thisRegister, byte thisValue) {

  // SCP1000 expects the register address in the upper 6 bits  // of the byte. So shift the bits left by two bits:  thisRegister = thisRegister << 2;
  // now combine the register address and the command into one byte:  byte dataToSend = thisRegister | WRITE;

  // take the chip select low to select the device:  digitalWrite(chipSelectPin, LOW);

  SPI.transfer(dataToSend); //Send register location  SPI.transfer(thisValue);  //Send value to record into register  // take the chip select high to de-select:  digitalWrite(chipSelectPin, HIGH);
}

Comments

  1. Jika kamu ingin sukses segera kunjungi Judi Togel Murah Resmi dengan bonus terbesar di Indonesia. Bandar Togel ini akan memberikan semua yang kamu perlukan karena pengalamannya di bidang ini. Mulai dari permainan yang variatif hingga keuntungan bonus deposit yang cukup melimpah. Tunggu apa lagi?

    ReplyDelete

Post a Comment

Popular posts from this blog

Discrete mathematics

            It's about Discrete mathematics in this book  #Anthony Croft, Engineering Mathematices, 5e (2017)  So i will choose exercise 5.2 #7 #8 #9  to slow everyone: 7 . The sets A, B and C are given by A = {1, 3, 5, 7, 9}, B = {0, 2, 4, 6} and C = {1, 5, 9} and the universal set, E = {0,1, 2, . . . ,9}. (a) Represent the sets on a Venn diagram. (b) State A ∪ B. (c) State B ∩ C. (d) State E ∩ C. (e) State not A. (f) State not B ∩not C. (g) State not (B ∪C). Ans :  a ) Represent the sets on a Venn diagram : The set containing all the numbers of interest is called the universal set, E. E is represented by the rectangular region. Sets A , B and C are represented  by the interiors of the circles and it is evident that 1 ,   3,  5,  7 and 9 are members of A while 0, 2,  4,  and 6 are members of B that 1,  5  and  9 are members of C....

Software Arduino IDE

Arduino is an open source computer hardware and software company, project, and user community that designs and manufactures single-board microcontrollers and microcontroller kits for building digital devices and interactive objects that can sense and control objects in the physical world. A program for Arduino hardware may be written in any programming language with compilers that produce binary machine code for the target processor. Atmel provides a development environment for their 8-bit AVR and 32-bit ARM Cortex-M based microcontrollers: AVR Studio (older) and Atmel Studio (newer). IDE The Arduino integrated development environment (IDE) is a cross-platform application (for Windows, macOS, Linux) that is written in the programming language Java. It originated from the IDE for the languages Processing and Wiring . It includes a code editor with features such as text cutting and pasting, searching and replacing text, automatic indenting, brace matching, and syntax highl...

Lab 2 , 3 , 4 Method math in java

Class Teedcalculator: /*  * To change this license header, choose License Headers in Project Properties.  * To change this template file, choose Tools | Templates  * and open the template in the editor.  */ package teedcalculator; import static teedcalculator.Oparetor.tand;// to access all static Tand of a class import static teedcalculator.Oparetor.tan;// to access all static Tan of a class import static teedcalculator.Oparetor.cost;// to access all static Cost of a class import static teedcalculator.Oparetor.cosd;// to access all static Cosd of a class import static teedcalculator.Oparetor.degree2;// to access all static Degree of a class import static teedcalculator.Oparetor.divide;// to access all static divide of a class import static teedcalculator.Oparetor.minus;// to access all static minus of a class import static teedcalculator.Oparetor.modulo;// to access all static modulo of a class import static teedcalculator.Oparetor.multiply;// to acce...