L'objectiu és compendre com funciona la llum mitjançant microcontroladaros i programació i en el meu cas transmissio de la llum a través de teles de diferent composicio i color. Tenim teles de cotó, polièster i lli blanques. Pel que fa el polièster tenim diversos colors.
El procediment per constrüir un espectofotòmetre consta de les següents parts:
Hem de buscar la bibliografia a google scholar el màxim d'absorbància de: àcid carmínic, luteïna i FCF
Nom | Carmín | Luteina | FCF | Font |
---|---|---|---|---|
Raquel Albarrán | 612nm (1) | 650nm | 630nm (3) | 1. Autores=Dayana Donneys-Victori,Cristian Camilo Ospina-Toro,Mónica Vanesa Zapata-Villegas, Nilson Marriaga-Cabrales,Fiderman Machuca-Martínez, Juan M. Peralta-Hérnandez, Carlos A. Martínez-Huitle Titulo= DYNA. Electrocoagulación de soluciones de índigo carmín empleando ánodos de magnesio y de aleación AZ31. Vol.85. Sept. 2018 https://www.scielo.cl/scielo.php?script=sci_arttext&pid=S0718-34292015000300004 2. https://grupofranja.net/danos-oculares-que-produce-la-luz-azul-y-mecanismos-fisiologicos-de-defensa/ 3. Autores=? Orange Country Biothecnology Education Collavorative Titulo: 1.6 Espectofotometría. Libre Texts Español (MindTouch) https://espanol.libretexts.org/Biologia/Biotecnolog%C3%ADa/Manual_de_Laboratorio%3A_Introducci%C3%B3n_a_la_Biotecnolog%C3%ADa/01%3A_T%C3%A9cnicas/1.06%3A_Espectrofotometr%C3%ADaibre Texts Español |
Manal El Morabit | 494 nm (4) | 455 nm (5) | 630 nm (6) | Carmín: Tello V, Vargas J Efecto de la luz artificial a diferentes fotoperiodos sobre dos variables productivas de la grana cochinilla, Dactylopius coccus Costa (Hemiptera: Dactylopiidae) para su cultivo bajo condiciones controladas VOLUMEN:33 no.3 Arica ago. 2015 Luteína: FCF: |
Alexis Álvarez | 494 nm | 445 nm | 620 nm | Àcid Carmínic: https://dialnet.unirioja.es/servlet/articulo?codigo=9252159 FCF: Luteina: https://digital.csic.es/bitstream/10261/172392/1/biomarocuhuman.pdf Luteína: https://digital.csic.es/bitstream/10261/172392/1/biomarocuhuman.pdf |
Bassim Lyamani | 535nm (4) | 422-445nm (5) | 560nm (6) | 4: Ocampo, C. Informe de pràctica de laboratorio, Universidad Peruana Union, Volumen nro. 5 pagines (9) (2006) (DOC) caracterizacion de colorantes | claudia ocampo - Academia.edu 5: Burgos J.T y Calderon F.R DETERMINACION DEL CONTENIDO DE CAROTENOIDES TOTALES EN OCHO ESPECIES DE FRUTAS Y VERDURAS COMERCIALIZADAS EN LA ZONA METROPOLITANA DE SAN SALVADOR |
494nm | 535nm | 623nm | ÀCID CARMÍNIC: Luteina: FCF: |
|
Joel Cano | 490-499 nm | 440 nm | 630 nm | (7B) Àcid Carmínic: Salazar,KG et al Extracción de ácido carmínico como colorante natural a partir de la cochinilla Pol.Con 8 : 583-605 (2023) https://dialnet.unirioja.es/servlet/articulo?codi go=9252159 (7D) FCF: Rodriguez,RF et al Evaluación de colorantes sintéticos en bebidas comercializadas en la ciudad de Trujillo en el periodo 2018 - 2019 Alpha Centauri 2 : 124-139 (2021) https://dialnet.unirioja.es/servlet/articulo?codigo=8092600 (7C) Luteína: Odorrisi, AA et al DESENVOLVIMENTO E VALIDAÇÃO DE MÉTODO ESPECTROFOTOMÉTRICO PARA DETERMINAÇÃO DE CORANTE À BASE DE LUTEÍNA ADICIONADO EM IOGURTE DESNATADO Quim. Nova 35 : 2057-2062 (2012) https://www.scielo.br/j/qn/a/6qfQpCHJ8jn8rH8RYyrVXSK/?lang=pt# |
Alex Roca | 495 nm | 445 nm | 620 - 630 nm | Carmín: Luteina: Estèvez, R. Biomarcadores de luteína, zeaxantina y otros carotenoides en la relación dieta y salud ocular humana (Tesis Doctoral) Universidad Complutense de Madrid. (2016) https://digital.csic.es/bitstream/10261/172392/1/biomarocuhuman.pdf FCF: Rodríguez, M.C. et al. Cuantificación simultánea de colorantes en bebidas deportivas utilizando espectroscopia visible y PLS–1. Revista FABICIB. volumen 17. PÁGS. 74 - 84. (2013) https://www.researchgate.net/publication/282977677_Cuantificacion_simultanea_de_colorantes_en_bebidas_deportivas_utilizando_espectroscopia_visible_y_PLS-1 |
Daniel Solis | 494 nm | 445 nm | 482 nm | (7B) Àcid Carmínic: Salazar,KG et al Extracción de ácido carmínico como colorante natural a partir de la cochinilla Pol.Con 8 583-605 (2023) file:///C:/Users/DanielSol%C3%ADsArteaga/Downloads/Dialnet-ExtraccionDeAcidoCarminicoComoColoranteNaturalAPar-9252159%20(1).pdf Luteina: https://www.boe.es/buscar/pdf/2009/BOE-A-2009-16021-consolidado.pdf FCF: https://www.argentina.gob.ar/normativa/recurso/86181/dto202-2003-12/htm |
Ariadna Arcas | 495 nm | 455 nm | 630 nm | Carmín:https://www.scielo.cl/scielo.php?script=sci_arttext&pid=S0718-34292015000300004 Luteína:https://grupofranja.net/danos-oculares-que-produce-la-luz-azul-y-mecanismos-fisiologicos-de-defensa/ FCF:https://espanol.libretexts.org/Biologia/Biotecnolog%C3%ADa/Manual_de_Laboratorio%3A_Introducci%C3%B3n_a_la_Biotecnolog%C3%ADa/01%3A_T%C3%A9cnicas/1.06%3A_Espectrofotometr%C3%ADa Orange Country Biothecnology Education Collaborative Titulo: 1.6 Espectofotometría. Libre Texts Español (MindTouch) |
Mariana Velasco | 494nm | 445nm | 630nm | https://docs.google.com/document/d/17PXOVwkcxc__sNLeHLdus3zdZb38olWlQAy8A463YLM/edit?usp=sharing |
Mateo Pérez | 494nm | 440nm | 630nm | Carmín: Luteína: https://dialnet.unirioja.es/servlet/articulo?codigo=8092600 FCF: |
Utilitzarem codis que faran un escaneig o scan de forma que encendrán els llums red, green and blue del led RGB de forma que generarem longitud d'ona que van des de 380 nanomètres a 780 nanomètres
Escriu la longitud d'ona en nanomètres i conventeix-la en RBG en la següent linia
A la figura 1 podem visualitzar la relació que té la longitud d'ona i el color
< input type="number" id="wavelength" value="550" min="380" max="780" >
El codi anterior que transforma longitud d'ona en valor RGB funciona de la següent manera: Longitud d'ona té una etiqueta o tag anomenat "label".
L'etiqueta input permet introduir qualsevol tipus de valors pel teclat, però la propietat o atribut de input anomenat type esta definida com a number i només permet introduir números. El value és una propietat o atribut de input que fa que surti com a valor predeterminat i min i max són els valors mínims i máxims i no s'acceptaran valors fora de marge. La Id es una propietat molt importannt ja que es com el DNI i el cridarem en getElementById
< button onclick="convertWavelength()" > Converteix a RGB < /button >
La aparaula button crea un botó de forma automàtica que té una propietat o atribut anomenada onclick que està esperant ser clicada o no. Altres que poden existir onmouseover (quan estic a sobre), onkeydown (quan pressiono una tecla), on load (quan es carrega una pàgina o un element), onsubmeet (quan envio un formulari).
El contingut del botó s'escriu abans del final de button.
Quan detecti que onclick és igual a true s'executarà una funció que no té cap paràmetre ni argument perquè té dos parèntesis buits. La funció s'anomena convertWavelenght i està definida més endevant amb la paraula function convertWavelenght(){...instruccions aquí...}. Això vol dir que quan clicko a un botó creat amb html crido a una funció creada en javaScript més endevant que convertirà la longitud d'ona que escric en RGB.
<div id="result"></div>
Un div és un divisor que és com un paràgraf en aquest cas buit que té un identificador anoomenat resul que només es veurà i s'executarà desprès, és a dir, quan es carrega la pàgina està buit u quan clickem el botó de convertir farà la seva funció.
function convertWavelength() {
const wavelength = document.getElementById("wavelength").value;
const R = Math.round(getRGBValue(wavelength, 'R'));
const G = Math.round(getRGBValue(wavelength, 'G'));
const B = Math.round(getRGBValue(wavelength, 'B'));
const result = `RGB values: (${R}, ${G}, ${B})`;
document.getElementById("result").textContent = result;
}
Una funció és una manera que tenim de transfomar un valor que donem nosaltres inicialment, en un altre diferent. En aquest cas volem transformar el valor de la longitud d'ona en tres valors: RGB.
Sempre que escric la paraula function, per crear una funció, he de posar al costat el nom de la funció, en anglés, que expliqui el que fa, en aquest cas convertir la longitud d'ona i poso convertWaveLength(), en camelCase, i posem un parentesis buit perquè no depen de paràmetres o arguments.
Dins de la funció tenim diverses instruccions agrupades en una clau
Les primeres 5 línies de la funció defineixen constants locals perquè s'apliquen dins de la funció i no afecten a tot el codi, a diferència de les constants globals que es posen fora de les funcions i afecten a tot el codi(const PI = 3,14;).
function getRGBValue(wavelength, color) {
const gamma = 0.8;
const factor = 0.1;
let R, G, B;
const nm = parseFloat(wavelength);
if (nm < 380 || nm > 780) {
return 0;
}
parseFloat transforma qualsevol variable en un float o número decimal i posteriorment en una altra funció Math round el transformarà en un numero sencer o integer. Si el número introduït com a nm està fora de marges no facis res que vol dir return 0
if (nm >= 380 && nm < 440) {
R = -(nm - 440) / (440 - 380);
G = 0;
B = 1;
} else if (nm >= 440 && nm < 490) {
R = 0;
G = (nm - 440) / (490 - 440);
B = 1;
} else if (nm >= 490 && nm < 510) {
R = 0;
G = 1;
B = -(nm - 510) / (510 - 490);
} else if (nm >= 510 && nm < 580) {
R = (nm - 510) / (580 - 510);
G = 1;
B = 0;
} else if (nm >= 580 && nm < 645) {
R = 1;
G = -(nm - 645) / (645 - 580);
B = 0.0;
} else if (nm >= 645 && nm < 781) {
R = 1;
G = 0;
B = 0;
}
if (color === 'R') {
return 255 * Math.pow(R, gamma);
} else if (color === 'G') {
return 255 * Math.pow(G, gamma);
} else if (color === 'B') {
return 255 * Math.pow(B, gamma);
}
}
El codi d'arduino és el següent:
//Creem 6 variables de tipus integer (int) , vol dir que els pins del 12 al 17, així els donem noms per identificarlos perquè és més fàcil
//Entendre pinLedR que 12 ja que vol dir el pin el que es conecta la pota R del Led RGB. Aquestes definicions ajuden a entendre el codi els humans
// i tenir ordenat el codi
int pinLedR = 12; // Pin per al LED vermell (RGB)
int pinLedG = 13; // Pin per al LED verd (RGB)
int pinLedB = 14; // Pin per al LED blau (RGB)
int pinLedUV = 15; // Pin per al LED ultraviolat
int pinLedIR = 16; // Pin per al LED infraroig
int pinLDR = 17; // Pin per al sensor LDR
/*setup és una funció de configuració que és obligatori declarar on diem que els pinMode que és el mode de conexió de cada pin, que pot ser sortida
(OUTPUT) perquè la llum surt cap a fora (output) en el cas del pinLedR, pinLedG, pinLedB, pinLedUV, pinLedIR. En el cas del sensor LDR és un INPUT,
vol dir que entra informació, en aquest cas llum de l'exterior
*/
void setup() {
pinMode(pinLedR, OUTPUT);
pinMode(pinLedG, OUTPUT);
pinMode(pinLedB, OUTPUT);
pinMode(pinLedUV, OUTPUT);
pinMode(pinLedIR, OUTPUT);
pinMode(pinLDR, INPUT);
/* serial està en majúscula perquè és una classe que controla la comunicació en sèrie entre el arduino i l'ordinador. Els rduino uno es comuniquen a 9600 bits per segon i els ESP-32 S3 es comuniquen a 115200 bits per segon
Serial.begin(9600); // Inicia la comunicació sèrie a 9600 bauds
}
void loop() {
if (Serial.available() > 0) {
//La comunicació sèrie ed a través d'un cable que antigament s'anomenava RS232 que tenia 9 pins, dels 9pins algúns eren per transmetre informació tipus dúplex que vl dir que envia informació des de l'ordinador a l'arduino i a l'inrevés. Internament el arduino i altres microcontrolador internament també tenen connexions fisiques i protocols de software RS232. El USB té 4 pins, els dos més allunyats dels centre són d'alimentació, per donar corrent(un dona càrrega positiva i l'altre és el terra), els altres dos pins del centre un circula l'informació cap a dintre de l'ordinador i l'altre cap a fora. Serial.available és un mètode available que significa disponibleque apliquem per la sintaxi del punt a una classe Serial (en altres llenguatges hauriem de crearun objecte es a dir Serial serial; o serial=new Serial();). El mètode avaliablle només acepta dos resultats mayor a 0 o igual a 0, si és igual a 0 significa que el cable no està conectat o dona error, i si és major a 0 significa que és capaç de rebre un carater ASCII.
char comanda = Serial.read(); // Llegeix la comanda enviada pel port sèrie
switch(comanda) {
case ‘I’: // Encén o apaga el LED infraroig i llegeix el sensor LDR
digitalWrite(pinLedIR, !digitalRead(pinLedIR));
llegirLDR();
break;
case ‘U’: // Encén o apaga el LED ultraviolat i llegeix el sensor LDR
digitalWrite(pinLedUV, !digitalRead(pinLedUV));
llegirLDR();
break;
case ‘R’: // Controla el LED RGB i llegeix el sensor LDR
int r = Serial.parseInt();
int g = Serial.parseInt();
int b = Serial.parseInt();
analogWrite(pinLedR, r); // Controla el LED vermell
analogWrite(pinLedG, g); // Controla el LED verd
analogWrite(pinLedB, b); // Controla el LED blau
llegirLDR();
break;
}
}
// Altres parts de la teva lògica del programa
}
void llegirLDR() {
int valorLDR = analogRead(pinLDR);
Serial.print(“Valor LDR: “);
Serial.println(valorLDR);
}
Els passos a seguir informàticament són els següents
sensorValue = analogRead(A0);
sensorVoltage = sensorValue/1024*5.0;
Primer de tot hem de crear una variable anomenada sensorValue i per crear-la utilitzem la instrucció float sensorValue;
Això crearà un espai de memòria gran capaç d'emmagatzemar un número decimal = "número point number" = número amb coma flotant. Aquest espai de memòria el puc anomenar com vulgi, si l'anomenes valorSensor en castellà o en català només ho entrendriem aquí.
El posem en anglès en estil camelCase o lletra de camell. Hi ha altres estils com snake_case, kebab-case, PascalCase. És a dir, la variable que emmagatzema els valors del sensor pot anomenar-se en els estils anteriors com el sensorValue (camelCase), sensor_value (snake_case), sensor-value (kebab-case) i SensorValue (PascalCase). Sempre s'ha de mantendre el mateix estil. El més utilitzat es el camelCase.
Es important el ; de cada línia perquè indica el final de l'instrucció.
En els microcontroladors petits que tenen molt poca memòria (Arduino UNO 16 KB, molt poc comparat a 512 KB del ESP32 S3) podrien gastar menys memòria definint variables més petites que números decimals com per exemple números sencers. En aquest darrer cas l'instrucció seria int sensorValue; perquè int significa integer number o número sencer i acepta 5 digits (5 espais de memòria) però només fins al número 64000 o 32000 i 1023 està dintre del margue.
Si tenim una variable float, quants digits guadra espai a la petita memòria del microcontrolador?
Com podem veure a la taula, posa que float acepta números de fins a 3.4028235E+38, que vol dir 3.4028235*1038, es a dir 38 espais de memòria disponibles per aquesta variable
Si en comptes d'un sensor fos una sortida analògica de 8 bits que és igual a 28 igual a 255, quina variable utilitzaries?
Si vull utilitzar byte no arribaria a 1023 si no a 255 i no serviria per un sensor que llegeix de 0 a 1023. Aquest de 255 es podria fer servir per una sortida analògica PWM de 8 bits, però estem parlant d'entrades analògiques de sensors
Convertidor analògic deigital ADC
Altres tipus de variables que consumeixen molt poca memòria es boolean. Boolean ve del nom d'un senyor Boole que va inventar àlgebra basada en 0 i 1, o en el seu equivalent false i true. Es pot fer servir per començar un moviment. Primer es false i després es true si es compleix una condició com per exemple pressionar una tecla.
Char es un altre tipus de variable, que vol dir caràcter i és compatible amb arduino, i que inclou els caràcters ASCII , on podem veure que els caràcters són números tant decimals com binaris. Per exemple la lletra a és el número decimal 97 i el número binari 01100001. Perquè 0*27+1*26+1*25+0*24+0*23+0*22+0*21+1*20= 0+64+32+0+0+0+0+1 = 97
En el cas arduino UNO, la velocitat de mostreig del rellotge inclós el ADC, és 125 kHz que vol dir 125000 cicles per segon. En el cas de ESP32-S3, la seva velocitat màxima és de 2 MHz, (20000000 de mostres pers segon) però realment s'aprofita només 1000 per segon, via wifi. Aquests valors tan alts són teòrics