KursaaTélite

Objetivos de la misión

La misión secundaria de este proyecto busca detectar si los niveles de partículas PM 0,5 y gramíneas, así como los niveles de radiación ionizante, son preocupantes para la salud de la población española y si pueden tener un impacto demográfico. A través de sensores, se evaluarán estos valores para determinar si hay un mayor riesgo de mortalidad en determinados grupos de edad o en personas que padecen con una patología, esencialmente cardiorrespiratoria, previa y, en consecuencia, poder tomar medidas preventivas y de protección para garantizar la seguridad y el bienestar de esta parte de la población.

Diseño Mecánico/estructural

El diseño de la carcasa de nuestro satélite de formato Cansat está hecho con impresión 3D, fue un procedimiento muy complejo ya mediante la plataforma de diseño sketchup y nuestra impresora 3D Oficial Creality Ender-3 tuvimos crear numerosos diseños de latas, variando el grosor de las paredes de tal forma que se mantenga lo suficientemente robusta para aguantar algún que otro impacto sin comprometer ni el tamaño ni el peso, manteniéndonos en los reglamentarios 6cm de diámetro, 11,5 cm de altura y 340g de peso.

Los componentes los cuales componen la estructura de este proyecto son los siguientes:


  • Sensor Geiger: Es un dispositivo utilizado para medir la cantidad de radiación ionizante en un área determinada. El sensor funciona detectando partículas ionizantes, como los rayos gamma y los rayos X, que son emitidos por materiales radiactivos. La cantidad de partículas ionizantes detectadas por el sensor se puede medir en unidades de radiación, como el Becquerel (Bq) o el Sievert (Sv); el análisis de los futuros datos que obtengamos será utilizado para la medición de la radiación ambiental y la monitorización de la radiación en áreas cercanas a centrales eléctricas con el fin de garantizar la seguridad y la aplicación de la ley.

  • TTGO T-Beam ESP32 LoRa: Es un microcontrolador que utiliza la tecnología de comunicación de largo alcance LoRa para permitir la transmisión de datos a largas distancias con bajo consumo de energía, también proporciona un rango de comunicación de hasta varios kilómetros en entornos urbanos y hasta 15 kilómetros en áreas rurales. El dispositivo también cuenta con un módulo GPS para la localización y un sensor de aceleración y giroscopio para la medición de la orientación y el movimiento. Sin duda es un componente esencial para la transmisión de los datos que obtendremos.

  • Sensor de polvo GP2Y1010AU: Es un sensor de calidad del aire que mide la cantidad de partículas suspendidas en el aire mediante el uso de un diodo emisor de luz (LED) y un fototransistor. Este sensor es capaz de detectar partículas finas de polvo y humo con un diámetro de entre 0,5 y 10 micrómetros. Estas partículas son muy pequeñas y pueden penetrar profundamente en los pulmones y causar daño a la salud. En España, los niveles de estos elementos pueden variar según la zona geográfica, la actividad industrial, el tráfico y las condiciones meteorológicas. En general, se considera que los niveles de PM 0,5 por debajo de 10 µg/m3 son aceptables para la salud humana, mientras que los niveles superiores a 25 µg/m3 pueden tener efectos negativos en la salud.

  • DHT 21: Es un sensor de temperatura y humedad que utiliza un sensor capacitivo de humedad y un termistor de alta precisión para medir la temperatura ambiente y la humedad relativa. Esta herramienta es muy precisa y tiene una resolución de 0.1 grados Celsius para la temperatura y del 1% para la humedad relativa, es sencillo de usar y se puede integrar fácilmente en nuestro satélite para monitorizar las condiciones en las que se realiza la medición.

Los Códigos de nuestro satélite  

El primero:

#include <SPI.h>

#include <LoRa.h>

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <DHT.h>

#include <DFRobot_Geiger.h>

#include <TinyGPS++.h>

#include <axp20x.h>

#define SCK 5

#define MISO 19

#define MOSI 27

#define SS 18

#define RST 14

#define DIO0 26


//433E6 for Asia

//866E6 for Europe

//915E6 for North America

#define BAND 866E6


int counter = 0;


#define DHTTYPE DHT11

const int DHTPin = 13;

DHT dht(DHTPin, DHTTYPE);


TinyGPSPlus gps;

HardwareSerial GPS(1);

AXP20X_Class axp;


#define detect_pin 3

DFRobot_Geiger geiger(detect_pin);


const int measurePin = 2;

int ledPower = 21;

int samplingTime = 280;

int deltaTime = 40;

int sleepTime = 9680;


float voMeasured = 0;

float calcVoltage = 0;

float dustDensity = 0;

float pm05 = 0;


void setup() {

Serial.begin(115200);

dht.begin();

geiger.start();

Wire.begin(21, 22);

Serial.println("LoRa Emisor iniciando");


if (!axp.begin(Wire, AXP192_SLAVE_ADDRESS)) {

Serial.println("AXP192 Begin PASS");

} else {

Serial.println("AXP192 Begin FAIL");

}

SPI.begin(SCK, MISO, MOSI, SS);

LoRa.setPins(SS, RST, DIO0);


axp.setPowerOutPut(AXP192_LDO2, AXP202_ON);

axp.setPowerOutPut(AXP192_LDO3, AXP202_ON);

axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON);

axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON);

axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON);

GPS.begin(9600, SERIAL_8N1, 34, 12);

if (!LoRa.begin(BAND)) {

Serial.println("Starting LoRa failed!");

while (1);

}

Serial.println("LoRa Initializing OK!");

delay(2000);

}

void loop() {

float h = dht.readHumidity();

float t = dht.readTemperature();

voMeasured = analogRead(measurePin);

digitalWrite(ledPower,LOW);

delayMicroseconds(samplingTime);

delayMicroseconds(deltaTime);

digitalWrite(ledPower,HIGH);

delayMicroseconds(sleepTime);


calcVoltage = 5*voMeasured/1024;

dustDensity = 0.17 * calcVoltage - 0.1;

pm05=(calcVoltage-0.0356)*120000;


Serial.print("Sending packet: ");

Serial.println(counter);

Serial.print("Humedad: ");

Serial.print(h);

Serial.print("% ");

Serial.print("Temperatura: ");

Serial.print(t);

Serial.println(" *C");

Serial.print("Dust Density(mg/m3): ");

Serial.println(dustDensity);

Serial.print("PM 0.5(particulas/0.01 pie3): ");

Serial.println(pm05);

Serial.print("CPM: ");

Serial.println(geiger.getCPM());

Serial.print("nSvh: ");

Serial.println(geiger.getnSvh());

Serial.print("uSvh: ");

Serial.println(geiger.getuSvh());

Serial.print("Latitude : ");

Serial.println(gps.location.lat(), 5);

Serial.print("Longitude : ");

Serial.println(gps.location.lng(), 4);

Serial.print("Satellites: ");

Serial.println(gps.satellites.value());

Serial.print("Altitude : ");

Serial.print(gps.altitude.feet() / 3.2808);

Serial.println("M");

Serial.print("Time : ");

Serial.print(gps.time.hour());

Serial.print(":");

Serial.print(gps.time.minute());

Serial.print(":");

Serial.println(gps.time.second());

Serial.print("Speed : ");

Serial.println(gps.speed.kmph());

Serial.println(" ");


LoRa.beginPacket();

LoRa.print("Paquete número: ");

LoRa.println(counter);

LoRa.print("Humedad: ");

LoRa.print(h);

LoRa.print("% ");

LoRa.print("Temperatura: ");

LoRa.print(t);

LoRa.println(" *C");

LoRa.print("Dust Density(mg/m3): ");

LoRa.println(dustDensity);

LoRa.print("PM 0.5(particulas/0.01 pie3): ");

LoRa.println(pm05);

LoRa.print("CPM: ");

LoRa.println(geiger.getCPM());

LoRa.print("nSvh: ");

LoRa.println(geiger.getnSvh());

LoRa.print("uSvh: ");

LoRa.println(geiger.getuSvh());

LoRa.print("Latitude: ");

LoRa.println(gps.location.lat(), 5);

LoRa.print("Longitude: ");

LoRa.println(gps.location.lng(), 4);

LoRa.print("Satellites: ");

LoRa.println(gps.satellites.value());

LoRa.print("Altitude: ");

LoRa.print(gps.altitude.feet() / 3.2808);

LoRa.println("M");

LoRa.print("Time: ");

LoRa.print(gps.time.hour());

LoRa.print(":");

LoRa.print(gps.time.minute());

LoRa.print(":");

LoRa.println(gps.time.second());

LoRa.print("Speed: ");

LoRa.println(gps.speed.kmph());

LoRa.println(" ");

LoRa.endPacket();

smartDelay(1000);

counter++;

if (millis() > 5000 && gps.charsProcessed() < 10){

Serial.println(F("No GPS data received: check wiring"));

}

delay(10000);

}

static void smartDelay(unsigned long ms)

{

unsigned long start = millis();

do

{

while (GPS.available())

gps.encode(GPS.read());

} while (millis() - start < ms);

}

El segundo:

#include <LoRa.h>

#include <mySD.h>

#include <Wire.h>

#include <SSD1306Wire.h>


File root;


#define SDA 4

#define SCL 15

#define oRST 16

#define OLED_ADDR 0x3C


SSD1306Wire display(OLED_ADDR, SDA, SCL);


#define row1 0

#define row2 10

#define row3 20

#define row4 30

#define row5 40

#define row6 50


#define SD_CLK 17

#define SD_MISO 13

#define SD_MOSI 12

#define SD_CS 23


#define LoRa_SCK 5

#define LoRa_MISO 19

#define LoRa_MOSI 27

#define LoRa_CS 18

#define LoRa_RST 14

#define DI0 26

#define BAND 866E6


#define Select LOW

#define DeSelect HIGH


File sessionFile;


int counter = 0;

int count = 0;

String recv = "";

String temp = "";


void setup(){

pinMode(oRST,OUTPUT);

pinMode(SD_CS,OUTPUT);

pinMode(LoRa_CS,OUTPUT);

digitalWrite(LoRa_CS, DeSelect);


digitalWrite(oRST, LOW);

delay(50);

digitalWrite(oRST, HIGH);


Serial.begin(115200);

while(!Serial);


display.init();

display.flipScreenVertically();

display.setFont(ArialMT_Plain_10);

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.clear();

display.display();


Serial.print("Initializing SD card...");

digitalWrite(SD_CS, Select);


if (!SD.begin( SD_CS, SD_MOSI, SD_MISO, SD_CLK )) {

Serial.println("initialization failed!");

} else {

Serial.println("initialization done.");

display.drawString( 5,row1,"SD Card OK!" );

display.display();

delay(1000);

}

root = SD.open("test.txt", FILE_WRITE);

if (root) {

root.flush();

root.close();

} else {

Serial.println("error opening test.txt");

}

display.drawString( 5,row2,"Wrote in test.txt" );

display.display();

delay(100);

root = SD.open("test.txt");

if (root) {

while (root.available()) {

Serial.write(root.read());

}

root.close();

} else {

Serial.println("error opening test.txt");

}

display.drawString( 5,row3,"Read from test.txt" );

display.display();

delay(100);

digitalWrite(SD_CS, DeSelect);


delay( 100 );


SPI.begin( LoRa_SCK, LoRa_MISO, LoRa_MOSI, LoRa_CS );

LoRa.setPins( LoRa_CS, LoRa_RST, DI0 );

digitalWrite(LoRa_CS, Select);

Serial.println("LoRa Sender");

if (!LoRa.begin(BAND)) {

Serial.println("Starting LoRa failed!");

display.drawString( 5, row4, "LoRa Init Failed!");

display.display();

} else {

Serial.println("LoRa Initial OK!");

display.drawString( 5, row4, "LoRa Initialized OK!");

display.display();

delay(1000);

}

digitalWrite(LoRa_CS, DeSelect);

Serial.println("Setup done!");

}

void loop() {

digitalWrite(LoRa_CS, Select);

if (LoRa.parsePacket()) {

recv = "";

while (LoRa.available()) {

recv += (char)LoRa.read();

}

count++;

display.clear();

display.drawString(5, row4, recv);

String info = "[" + String(count) + "]" + "RSSI " + String(LoRa.packetRssi());

display.drawString(5, row2, info);

display.display();

}

if(temp != recv){

temp = recv;

digitalWrite(LoRa_CS, DeSelect);

delay(50);

digitalWrite(SD_CS, Select);

root = SD.open("test.txt", FILE_WRITE);

Serial.println(root);

if (root) {

root.println(temp);

root.flush();

root.close();

}

Serial.println(temp);

digitalWrite(SD_CS, DeSelect);

delay(50);

}

}

¡Crea tu página web gratis! Esta página web fue creada con Webnode. Crea tu propia web gratis hoy mismo! Comenzar