True
DIY Projects to Help Mitigate Coronavirus

If you are looking for projects to fight COVID-19 for your home, business, community, etc., you will love these projects using open-source hardware.

Here are some fantastic projects you can make to prevent the spread of coronavirus. 

1.) Indoor Hand-held Co2 Detector

Coronavirus is an infectious disease and is transmitted mainly by breathing, coughing, or talking. To check if a room is contaminated with potentially contagious exhaled breath, carbon dioxide concentration must be utilized. The carbon dioxide concentration will determine if there is enough fresh air circulating into the room. In this project, Seeed Studio used Seeeduino Xiao to find out if there is enough air exchange in the room.  

Hardware Components

Hardware Connection

Software

Arduino IDE

Code

#include <Arduino.h>
#include <U8x8lib.h> //https://github.com/Seeed-Studio/OLED_Display_128X64/archive/master.zip
#include "SCD30.h" //https://github.com/Seeed-Studio/Seeed_SCD30
#if defined(ARDUINO_ARCH_AVR)
    #pragma message("Defined architecture for ARDUINO_ARCH_AVR.")
    #define SERIAL Serial
#elif defined(ARDUINO_ARCH_SAM)
    #pragma message("Defined architecture for ARDUINO_ARCH_SAM.")
    #define SERIAL SerialUSB
#elif defined(ARDUINO_ARCH_SAMD)
    #pragma message("Defined architecture for ARDUINO_ARCH_SAMD.")  
    #define SERIAL SerialUSB
#elif defined(ARDUINO_ARCH_STM32F4)
    #pragma message("Defined architecture for ARDUINO_ARCH_STM32F4.")
    #define SERIAL SerialUSB
#else
    #pragma message("Not found any architecture.")
    #define SERIAL Serial
#endif
 U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
 int speakerPin = A3;
// U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // OLEDs without Reset of the Display

void setup(void) {
  u8x8.begin();
  u8x8.setFlipMode(1);   // set number from 1 to 3, the screen word will rotary 180
  Wire.begin();
  scd30.initialize();
  pinMode(speakerPin, OUTPUT);
}
 
void loop(void) {
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  u8x8.setFlipMode(0);//Reverse screen
  u8x8.drawString(0,0,"CO2:");
  u8x8.drawString(0,10,"TEMP:");
  u8x8.drawString(0,20,"HUM:");
  float result[3] = {0};
     if(scd30.isAvailable()){      
       scd30.getCarbonDioxideConcentration(result);
         u8x8.setInverseFont(0);
         float co2 = result[0];
         float temp = result[1];
         float hum = result[2];
         u8x8.setCursor(7, 0);
         u8x8.println(co2);
         u8x8.setCursor(7, 10);
         u8x8.println(temp);
         u8x8.setCursor(7, 20);
         u8x8.println(hum);
            if(co2 > 800){
                u8x8.setInverseFont(1);
                tone(speakerPin, 900, 200);
            }
     }
     delay(10 00);
}


 
 

2.) Pocket Distance Alarm

People will existing illnesses are at a higher risk of developing severe complications with coronavirus. That is why WHO is collaborating with global leaders to call us to keep at least a 1-meter distance from others. To remind us, Makerming made this little pocket distance alarm to give light and sound warnings when people get into your one-meter circle. 

Hardware Components

Hardware Connection

Software

Arduino IDE

Code

const int Buzzer = 8;// D8
const int LED = 7;//LED D7

#include "Seeed_vl53l0x.h"
Seeed_vl53l0x VL53L0X;  //tof   IIC D4 D5
   
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL SerialUSB
#else
    #define SERIAL Serial
#endif

void setup() {

    pinMode(Buzzer, OUTPUT);
    pinMode(LED, OUTPUT);
    digitalWrite(Buzzer, LOW);   // turn the Buzzer on (HIGH is the voltage level)
    digitalWrite(LED, LOW);   // turn the LED on (HIGH is the voltage level)
            
    VL53L0X_Error Status = VL53L0X_ERROR_NONE;
    SERIAL.begin(115200);
    Status = VL53L0X.VL53L0X_common_init();
    if (VL53L0X_ERROR_NONE != Status) {
        SERIAL.println("start vl53l0x mesurement failed!");
        VL53L0X.print_pal_error(Status);
        while (1);
    }
    VL53L0X.VL53L0X_long_distance_ranging_init();

    if (VL53L0X_ERROR_NONE != Status) {
        SERIAL.println("start vl53l0x mesurement failed!");
        VL53L0X.print_pal_error(Status);
        while (1);
    }
}

void loop() {

    VL53L0X_RangingMeasurementData_t RangingMeasurementData;
    VL53L0X_Error Status = VL53L0X_ERROR_NONE;

    memset(&RangingMeasurementData, 0, sizeof(VL53L0X_RangingMeasurementData_t));
    Status = VL53L0X.PerformSingleRangingMeasurement(&RangingMeasurementData);
    if (VL53L0X_ERROR_NONE == Status) {
        if (RangingMeasurementData.RangeMilliMeter >= 2000) {
            SERIAL.println("out of range!!");
            digitalWrite(Buzzer, LOW);   // turn the Buzzer on (HIGH is the voltage level)
            digitalWrite(LED, LOW);   // turn the LED on (HIGH is the voltage level)
            
        } 
           else if (RangingMeasurementData.RangeMilliMeter <= 1000) {
            digitalWrite(Buzzer, HIGH);   // turn the Buzzer on (HIGH is the voltage level)
            digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
            SERIAL.print("Distance:");
            SERIAL.print(RangingMeasurementData.RangeMilliMeter);
            SERIAL.println(" mm");
           } 
              else {    
                  digitalWrite(Buzzer, LOW);   // turn the Buzzer on (HIGH is the voltage level)
                  digitalWrite(LED, LOW);   // turn the LED on (HIGH is the voltage level)
                  SERIAL.print("Distance:");
                  SERIAL.print(RangingMeasurementData.RangeMilliMeter);
                  SERIAL.println(" mm");
              }
    }
    else {
        SERIAL.print("mesurement failed !! Status code =");
        SERIAL.println(Status);
        digitalWrite(Buzzer, LOW);   // turn the Buzzer on (HIGH is the voltage level)
        digitalWrite(LED, LOW);   // turn the LED on (HIGH is the voltage level)
        
    }
    delay(250);
    
    
}


 
 

3.) Non-Contact Switch for Public Water Dispenser

To avoid cross-infection caused by bacterial virus transmission, Makerming made an automatic sensor switch on Arduino for a public water dispenser.

 

Hardware Components

Hardware Connection

Software

Arduino IDE

Code

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
int anglepin = A0;  // analog pin used to connect the potentiometer
int angle;    // variable to read the angleue from the analog pin
#define SENSOR  7  //connect IR Sensor to pin7
void setup() {
   Serial.begin(115200);
   myservo.attach(8);  // attaches the servo on pin 8 to the servo object
   pinMode(SENSOR,INPUT);
   myservo.write(15);
}
void loop() {
    short sensor=0;
    sensor=digitalRead(SENSOR);
   // Serial.print("sensor=");
    Serial.println((int)sensor);
  angle = analogRead(anglepin);            // reads the angleue of the potentiometer (angleue between 0 and 1023)
  angle = map(angle, 0, 1023, 0, 180);  
  
    if(0==sensor)
    {
        Serial.println("Sensor is triggered!!");
        delay(200);
        myservo.write(angle); 
    }
    else{
            myservo.write(angle-30);
            }
}


 
 
 

4.) Coronavirus Detector Mask

One of the most common symptoms of Coronavirus is a fever/high temperature ranging from 37.8C or higher. To detect the person's temperature, Linterislinter invented a coronavirus detector mask. The mask functions with the use of a digital infrared temperature sensor. It can read the body temperature in real-time and will appear on the OLED display attached to the front. While the detector, on the other side, can identify the person they have contacted. The RGB LED ring in the left eye will turn green if the person's temperature is average. However, if the other person's temperature goes beyond 38℃, the RGB LED ring will turn red and will make an alert alarming that they are at potential risk of acquiring Coronavirus.


Hardware Components

  • 1 x Arduino Uno

  • 1 x Grove Base Shield V2.0

  • 2 x Grove - Digital Infrared Temperature Sensor

  • 1 x Grove - MP3 v2.0

  • 1 x Battery

  • 1 x Grove - Button

  • 1 x Mono Enclosed Speaker - 2W 6 Ohm Mono Enclosed Speaker - 2W 6 Ohm

  • 1 x Grove - OLED Display 1.12'' V2

  • 1 x Grove - RGB LED Ring (20 - WS2813 Mini)

Hardware Connection

 

Software

Arduino IDE

Code

#include <Wire.h>
#include <SeeedGrayOLED.h>
#include <avr/pgmspace.h>

#include "Adafruit_NeoPixel.h"

#include "MLX90615.h"

#include "WT2003S_Player.h"

#ifdef __AVR__
#include <SoftwareSerial.h>
SoftwareSerial SSerial(2, 3); // RX, TX
#define COMSerial SSerial
#define ShowSerial Serial 

WT2003S<SoftwareSerial> Mp3Player;
#endif

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define COMSerial Serial1
#define ShowSerial SerialUSB 

WT2003S<Uart> Mp3Player;
#endif

#ifdef ARDUINO_ARCH_STM32F4
#define COMSerial Serial
#define ShowSerial SerialUSB 

WT2003S<HardwareSerial> Mp3Player;
#endif

 #define BY_PINS // Uncomment this to use pins for every MLX
// #define BY_ADDR // Uncomment this to use single bus

#ifdef BY_PINS // USING ADDITIONAL PINS
    byte sda_1 = 5;
    byte scl_1 = 4;
    byte sda_2 = 7;
    byte scl_2 = 6;

    SoftI2cMaster i2c_1(sda_1, scl_1);
    MLX90615 mlx90615_1(DEVICE_ADDR, &i2c_1);
    SoftI2cMaster i2c_2(sda_2, scl_2);
    MLX90615 mlx90615_2(DEVICE_ADDR, &i2c_2);
#endif // BY_PINS

#ifdef BY_ADDR
    // TODO: Update with your real addresses and quantity of MLXs!
    #define DEVICE1_ADDR DEVICE_ADDR
    #define DEVICE2_ADDR DEVICE_ADDR+1

    // #define INCLUDED_I2C

    #ifdef INCLUDED_I2C // Using included I2C Library
        #define SDA_PIN SDA   //define the SDA pin
        #define SCL_PIN SCL   //define the SCL pin
        SoftI2cMaster i2c_bus(SDA_PIN, SCL_PIN);
        MLX90615 mlx90615_1(DEVICE1_ADDR, &i2c_bus);
        MLX90615 mlx90615_2(DEVICE2_ADDR, &i2c_bus);
    #else // Using Wire
        MLX90615 mlx90615_1(DEVICE1_ADDR, &Wire);
        MLX90615 mlx90615_2(DEVICE2_ADDR, &Wire);
    #endif // WITH_WIRE defined
#endif // BY_ADDR defined

//LED
#define PIN 8
#define NUMPIXELS      24
#define BRIGHTNESS 255

Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500; // delay for half a 

int button1 = 14;  //trigger button A0

//MP3
uint8_t vol = 70;
uint32_t spi_flash_songs = 0;
uint32_t sd_songs = 0;
STROAGE workdisk = SD;

float temperatureObj1 = 0;
float temperatureObj2 = 0;

void setup() {
    Wire.begin();
    SeeedGrayOled.init(SH1107G);             //initialize SEEED OLED display
    SeeedGrayOled.clearDisplay();     //Clear Display.
    SeeedGrayOled.setNormalDisplay(); //Set Normal Display Mode
    SeeedGrayOled.setVerticalMode();  // Set to vertical mode for displaying text

    COMSerial.begin(9600);
    Mp3Player.init(COMSerial);
    Mp3Player.volume(vol);
    
    Serial.begin(115200);
    while (!Serial); // Only for native USB serial
    delay(2000); // Additional delay to allow open the terminal to see setup() messages
    Serial.println("Setup...");
    

    pinMode(button1, INPUT);


    strip.setBrightness(BRIGHTNESS);
    strip.begin();
    strip.show(); // Initialize all pixels to 'off'

    #ifdef WITH_WIRE
    Wire.begin();
    #endif // WITH_WIRE defined
}

void loop() {
    temperatureObj1 = mlx90615_1.getTemperature(MLX90615_OBJECT_TEMPERATURE);
    temperatureObj1=temperatureObj1+3;
    
    if(digitalRead(button1)){
      temperatureObj2 = mlx90615_2.getTemperature(MLX90615_OBJECT_TEMPERATURE);
      temperatureObj2=temperatureObj2+3;
      if(temperatureObj2<38){
           mode1();
        }
       else{
        Mp3Player.playSDRootSong(0x0001);
        mode2();
       }
      
    }

    delay(1000); 
      
//    Serial.print("Temp_1: ");
//    Serial.print(temperatureObj1);
//    Serial.print("°C  ");

    SeeedGrayOled.setTextXY(2,0);  //set Cursor to ith line, 0th column
    SeeedGrayOled.setGrayLevel(5); //Set Grayscale level. Any number between 0 - 15.
    SeeedGrayOled.putFloat(temperatureObj1); //Print Hello World
}

void mode1(void){
  
  for(int i=0;i<NUMPIXELS;i++){
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    strip.setPixelColor(i, strip.Color(0,255,0)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
//    delay(250); // Delay for a period of time (in milliseconds).
  }
}

void mode2(void){
  
  for(int i=0;i<NUMPIXELS;i++){
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    strip.setPixelColor(i, strip.Color(255,0,0)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
//    delay(250); // Delay for a period of time (in milliseconds).
  }
}

Warning Signal 


 
 

DIY Projects to Help Mitigate Coronavirus
snoosnoo 2 August, 2021
Share this post
Archive
Sign in to leave a comment
How to Set up TrueNAS Storage Operating System

To install this Web App in your iPhone/iPad press and then Add to Home Screen.