AM2320 temperature and humidity sensor and ESP8266 example

Temperature and humidity combined sensor AM2320 digital temperature and humidity sensor is a digital signal output has been calibrated. Using special temperature and humidity acquisition technology, ensure that the product has a very high reliability and excellent long-term stability. Sensor consists of a capacitive moisture element and an integrated high-precision temperature measurement devices, and connected with a high-performance microprocessor .

AM2320 communication using a single bus, two communication modes standard I2C. Standard single-bus interface, the system integration becomes easy and quick. Ultra-small size, low power consumption, signal transmission distance up to 20 meters, making all kinds of applications and even the most demanding applications the best choice. I2C communication using standard communication sequence, the user can directly linked to the I2C communication bus without additional wiring, simple to use. Two communication modes are used as humidity, temperature, and other digital information directly CRC checksum temperature-compensated output, users do not need to calculate the secondary digital output, and no need for temperature compensation of the humidity, temperature and humidity can be accurately information. Two communication modes are free to switch, the user can freely choose, easy to use, wide range of applications.

 

Specifications

• Operating Voltage: 3.1 VDC to 5.5 VDC
• Operating Temperature Range: -40 ° C to + 80 ° C
• Humidity Range: 0 to 99.9% RH
• Accuracy ( 25 ° C environment)
Temperature: ± 0.5 ° C
Humidity: ± 3%
• RH (10 … 90% RH)
Resolution: Temperature: 0.1 ° C
Resolution: Humidity: 0.1% RH
• Attenuation values
Temperature: <0.1 ℃ / Year
Humidity: <1% RH / Year
• Response time: Temperature: 5s
• Response Time: Humidity: 5s 1 / e (63%)
• Output signal: single bus / IIC signal
• Housing material: PC plastic

 

Layout

a simple I2C sensor with a 3.1 to 5.5v range its straightforward to connect this device to a Wemos Mini

 

Code

You will need to install the folllowing library from https://github.com/EngDial/AM2320

This is the default example

 

#include <Wire.h>
#include <AM2320.h>
 
AM2320 th;
 
void setup() {
Serial.begin(9600);
Wire.begin();
}
 
void loop() {
Serial.println("Chip = AM2320");
switch(th.Read()) {
case 2:
Serial.println(" CRC failed");
break;
case 1:
Serial.println(" Sensor offline");
break;
case 0:
Serial.print(" Humidity = ");
Serial.print(th.Humidity);
Serial.println("%");
Serial.print(" Temperature = ");
Serial.print(th.cTemp);
Serial.println("*C");
Serial.println();
break;
}
delay(2000);
}

 

 

 

Output

Open the serial monitor

Chip = AM2320
Humidity = 47.10%
Temperature = 24.80*C

Chip = AM2320
Humidity = 48.70%
Temperature = 25.10*C

Chip = AM2320
Humidity = 53.60%
Temperature = 25.40*C

Chip = AM2320
Humidity = 55.80%
Temperature = 25.80*C

Chip = AM2320
Humidity = 59.80%
Temperature = 26.20*C

 

Links

AM2320 Digital Temperature and Humidity Sensor Replace AM2302 SHT10

https://akizukidenshi.com/download/ds/aosong/AM2320.pdf

Wemos mini and OLED shield bitcoin ticker

In this example we will display the price in USD of 1 bitcoin, the data is taken from coindesk’s API and displayed on an oled display.

This is similar to our previous examples, you do not need to use a Wemos mini or the OLED shield below but this makes the project easier to build

Here is the oled shield for the Wemos mini

Here is the wemos mini

Code


#include <ESP8266WiFi.h>
#include <Wire.h>
#include <SFE_MicroOLED.h>
#include <ArduinoJson.h>

const char* ssid = "iainhendry";
const char* pass = "iain061271";
#define PIN_RESET 255 //
#define DC_JUMPER 0 // I2C Addres: 0 - 0x3C, 1 - 0x3D
String id;
String value;
String json;

MicroOLED oled(PIN_RESET, DC_JUMPER); // I2C Example

WiFiClient client;

// delay between updates
const unsigned long postingInterval = 60L * 1000L;
unsigned long lastConnectionTime = 0;

void setup()
{
delay(100);
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

Serial.print("Connecting to ");

oled.begin();
oled.clear(ALL);
oled.setCursor(0,0);
oled.display();
oled.clear(PAGE);
oled.clear(ALL);
oled.print("Bitcoin price");
oled.setCursor(0,1);
oled.print("loading..");
oled.display(); // Display what's in the buffer (splashscreen)
delay(50);

}

int check_connect = 0;

void httpRequest()
{
client.stop();

// if there's a successful connection:
if (client.connect("api.coindesk.com", 80))
{
Serial.println("connecting...");
client.println("GET /v1/bpi/currentprice.json HTTP/1.1");
client.println("Host: api.coindesk.com");
client.println("User-Agent: ESP8266/1.1");
client.println("Connection: close");
client.println();
lastConnectionTime = millis();
}
else
{
// if you couldn't make a connection:
Serial.println("connection failed");
}
}

void loop()
{
int cnt;

if (cnt++ == 10000)
{
cnt = 0;
if (check_connect++ == 50)
{
check_connect = 0;
if (WiFi.status() != WL_CONNECTED)
{
}
}
}

if (millis() - lastConnectionTime > postingInterval)
{
httpRequest();
unsigned int i = 0; //timeout counter
int n = 1; // char counter
char json[500] ="{";

while (!client.find("\"USD\":{")){}

while (i<20000)
{
if (client.available())
{
char c = client.read();
json[n]=c;
if (c=='}') break;
n++;
i=0;
}
i++;
}

StaticJsonBuffer<500> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);

String newjson = root["code"];
String value = root["rate"];
id = newjson.substring(9,12);

// value = newjson.substring(41,51);
oled.display();
oled.clear(PAGE); // Clear the display's internal memory
oled.clear(ALL); // Clear the library's display buffer
oled.setCursor(0,1);
oled.print(value);
oled.display();

id="";
value="";
}
}

testing

You should see something like this on the oled display

esp8266 bitcoin ticker

esp8266 bitcoin ticker

Links

Here are some of the products I used

Smart Electronics D1 mini – Mini NodeMcu 4M bytes Lua WIFI Internet of Things development board based ESP8266 by WeMos

0.66″ inch For Wemos Oled 64X48 IIC I2C LCD OLED LED Dispaly Shield for Arduino Compatible For WeMos D1 Mini SSD1306 OLED Shield

by hotcoin.net

ESP8266 and MPU6500 6-axis Motion Tracking device

The MPU-6500 is the company’s second-generation 6-axis Motion Tracking device for smartphones, tablets, wearable sensors, and other consumer markets.

The MPU-6500, delivered in a 3 mm x 3 mm x 0.9 mm QFN package, addresses the market requirements for high-performance applications such as pedestrian navigation, context-aware advertising, and other location-based services.

The device also supports the specifications for emerging wearable sensor applications, such as remote health monitoring, sports and fitness tracking, and other consumer applications.

Features

Digital-output of 6-axis MotionFusion data.
9-axis fused data from Motion Processing Library
Tri-Axis angular rate sensor (gyro) with a sensitivity up to 131 LSBs/dps and a full-scale range of ±250, ±500, ±1000, and ±2000dps
Tri-Axis accelerometer with a programmable full scale range of ±2g, ±4g, ±8g and ±16g
Reduced settling effects and sensor drift by elimination of board-level cross-axis alignment errors between accelerometers and gyroscopes
Digital Motion Processing™ (DMP™) engine offloads complex MotionFusion, sensor timing synchronization and gesture detection
MotionApps™ Platform support for Android, Linux, and Windows
Embedded algorithms for run-time bias and compass calibration
Digital-output temperature sensor
Digital input on FSYNC pin to support video Electronic Image Stabilization
Programmable interrupt supports gesture recognition, panning, zooming, scrolling, tap detection, and shake detection
VDD Supply voltage range of 1.71V–3.6V
Gyro operating current: 3.2mA (full power, gyro at all rates)
Gyro + Accel operating current: 3.4mA (full power, gyro at all rates, accel at 1kHz sample rate)
Accel low power mode operating currents: 18.65µA at 31.25Hz
Full Chip Idle Mode Supply Current: 6µA
400kHz Fast Mode I²C or up to 20MHz SPI serial host interfaces
10,000g shock tolerant

 

Layout

 

 

Code

I found a library here that seemed to work ok – http://www.uctronics.com/download/U3635_MPU6500.zip

 

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#include "Wire.h"
 
// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"
#include "MPU6050.h"
 
// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 accelgyro;
 
int16_t ax, ay, az;
int16_t gx, gy, gz;
 
#define LED_PIN 13
bool blinkState = false;
 
void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
 
// initialize serial communication
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
// it's really up to you depending on your project)
Serial.begin(38400);
 
// initialize device
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
 
// verify connection
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
 
// configure Arduino LED for
pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
 
// these methods (and a few others) are also available
//accelgyro.getAcceleration(&ax, &ay, &az);
//accelgyro.getRotation(&gx, &gy, &gz);
 
// display tab-separated accel/gyro x/y/z values
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.println(gz);
 
// blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}

 

Output

Open the serial monitor

a/g: -280 -10732 -7336 32767 18392 -32768
a/g: 1620 -9008 -5564 32767 16477 -32768
a/g: 4368 -10656 -4060 32767 15867 -32768
a/g: 7724 -9952 -832 32767 14362 -32768
a/g: 6512 -6872 -340 32767 19106 -32768
a/g: 13252 -12072 3184 32767 20260 -32768
a/g: 15236 -12164 4784 32767 16474 -32768
a/g: 13152 -12644 2924 32767 10330 -32768
a/g: 16376 -11592 4708 31548 6686 -32768
a/g: 15676 -10160 4612 28194 3577 -32768
a/g: 15320 -10376 4480 25826 63 -32768
a/g: 17024 -9380 5472 25643 -483 -32768
a/g: 12064 -8728 4524 25102 -2927 -32768
a/g: 13240 -7600 5172 21817 -4007 -32768

 

Link

https://www.invensense.com/wp-content/uploads/2015/02/MPU-6500-Datasheet2.pdf

GY-6500 MPU-6500 6DOF six-axis accelerometer 6-axis attitude gyro sensor module SPI Interface MPU6500

ESP8266 and GY-21P module example

This module  combines a BMP280 sensor and an SI7021 sensor. The on-board BMP280+SI7021 sensor measures atmospheric pressure from 30kPa to 110kPa as well as relative humidity and temperature.

BMP280
Pressure range: 300-1100 hPa (9000 meters above sea level at -500m)
Relative accuracy (at 950 – 1050 hPa at 25 ° C): ± 0.12 hPa, equiv. to ± 1 m
Absolute accuracy (at (950 – 1050 hPa, 0 – +40 ° C): ± 0.12 hPa, equiv. To ± 1 m
Mains voltage: 1.8V – 3.6V
Power consumption: 2.7µA at 1Hz readout rate
Temperature range: -40 to + 85 ° C

SI7021
HVAC/R
Thermostats/humidistats
Respiratory therapy
White goods
Indoor weather stations
Micro-environments/data centers
Automotive climate control and defogging
Asset and goods tracking
Mobile phones and tablets
Size: 1.3*1cm/0.51*0.39″

Features:

Operation Voltage: 3.3V
I2C & SPI Communications Interface
Temp Range: -40C to 85C
Humidity Range: 0 – 100% RH, =-3% from 20-80%
Pressure Range: 30,000Pa to 110,000Pa, relative accuracy of 12Pa, absolute accuracy of 100Pa
Altitude Range: 0 to 30,000 ft (9.2 km), relative accuracy of 3.3 ft (1 m) at sea level, 6.6 (2 m) at 30,000 ft.

 

Layout

wemos and gy21b

wemos and gy21b

 

Code

I used a variety of Adafruit libraries for this example, I took the default examples and made the following out of them

https://github.com/adafruit/Adafruit_Sensor

https://github.com/adafruit/Adafruit_BMP280_Library

https://github.com/adafruit/Adafruit_Si7021

 

 

include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include "Adafruit_Si7021.h"
 
Adafruit_BMP280 bme; // I2C
Adafruit_Si7021 sensor = Adafruit_Si7021();
 
void setup() 
{
Serial.begin(9600);
Serial.println("BMP280 and SI7021 (GY-21p) test");
 
if (!bme.begin()) 
{ 
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
 
if (!sensor.begin()) 
{
Serial.println("Did not find Si7021 sensor!");
while (true);
}
}
 
void loop() 
{
Serial.println("BMP280 results");
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure());
Serial.println(" Pa");
Serial.print("Approx altitude = ");
Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase
Serial.println(" m");
Serial.println();
 
Serial.println("SI7021 results");
Serial.print("Humidity: "); 
Serial.println(sensor.readHumidity(), 2);
Serial.print("Temperature: "); 
Serial.println(sensor.readTemperature(), 2);
Serial.println();
delay(2000);
}

 

Output

Open the serial monitor and you should see something like this

BMP280 results
Temperature = 27.26 *C
Pressure = 99042.63 Pa
Approx altitude = 191.78 m

SI7021 results
Humidity: 31.04
Temperature: 27.30

BMP280 results
Temperature = 28.43 *C
Pressure = 99044.82 Pa
Approx altitude = 191.60 m

SI7021 results
Humidity: 32.59
Temperature: 28.56

BMP280 results
Temperature = 28.17 *C
Pressure = 99037.41 Pa
Approx altitude = 192.22 m

SI7021 results
Humidity: 32.88
Temperature: 28.46

You can see the temperature output is close between the sensors

 

Links

Atmospheric Humidity Temperature Sensor Breakout Barometric Pressure BMP280 SI7021 for Arduino