Benvinguts al projecte d'espectofotometria!

L'objectiu és compendre com funcina la llum mitjançant elecrofotometres i programació i en el meu cas poder lleguir la quantitat de llum que reben diferents leds rgb de colors vermell, verd, groc, blau i blanc, per tal de relacionar-ho amb l'efecte MIMS Neocities.

Trobar el màxim d'absorbància de cada color

Hem de buscar de buscar la bibliogràfia a google sobre el màxim d'absorbancia

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:

Comprobar el màxim d'absorbancia amb codi

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 visualtizar la relació que té longitud d'on ai color

Trullii
Fig1 - Espectre de llum visible amb l'ongitud d'ona ne nanomètres.
< 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 anomenada "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 paraula button crea un butó de forma automàtica que té una propietat o atribut anomenada onclick que esta esperant ser clickada o no. Altres que poden existir onmouseover (quan estic a sobre), onkeydown (quan pressiono una tecla), onload (quan es carrega una pàgina o un element)i onsubmit (quan envió un formulari).

El contingut del botó s'escriu abans del final de button.

Quan detecti que onclick es igual a true s'executara una funció que no té cap parametre 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 una funció creada en javascript més endevant que convertirà la longitud d'ona que escric en RGB.

< div id="ressult" > </div >

Un div és un divisor que és un paràgraf en aquest cas buit que té un identificador anomenat result que només es veura i s'executarà després, es a dir, quan es carrega la pàgina està buit i 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 de transformar 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 paso convertWaveLenght(), 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).

  1. La primera línia de la funció agrafa el valor (.value) de la longitud que s'ha introduït a l'input, i ho identifica perquè l'agafa amb el getElementById, i l'emmagatzxema amb un nom concret (waveLenght) que no pot variar dins de la funció, però si globalment
  2. const R = Math.round(getRGBValue(wavelength, 'R')); const G = Math.round(getRGBValue(wavelength, 'G')); const B = Math.round(getRGBValue(wavelength, 'B')); El que fa aquestes línia és agafar una funció que s'anomena RGBValue i que té dos paràmteres o arguments interns que són: primer la longitud d'ona introduïda per l'usuari i el segón, el valor RGB que generem. El valor del càlcul matemàtic que obté la funció getRGBValue, de RGB és un float(número decimal), i nosaltres el convertim en un int(integer o número sencer), i el guardem en una variable constant local anomenada R, G o B.
  3. const result = `RGB values: (${R}, ${G}, ${B})`;
    document.getElementById("result").textContent = result;
    El result col·loca els valors obtinguts anteriorment amb el sel·lector "$", dins del div buit amb identificador "result".
  
  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 número sencer o integer. Si el número introduït com a nm esta fora de marges no facis res que vol dir return 0

  1. La funció getRGBValue, té dos arguments interns que són: la longitud d'ona i el color, i necessita dos constants (gamma i factor) per fer la transformació matemàtica entre longitud d'ona i valor RGB, ja que el color és complexe i gamma i factor corregeixen les fòrmules que veurem més endavant perquè aquí la fòrmula és molt simple: si l'usuari introdueix un valor entre 380 nm i 780 nm, es donarà un valor 0 perquè estem fora de marge de la longitud d'ona visible..


  

     if (nm < 380 || nm > 780) {
          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);
        }
      }

 
  1. Si el valor que s'introdueix es troba entre els dos valors, es fa una divisió entre el valor en específic, menys el valor màxim de marge, entre la resta dels dos marges, donant el valor d'un dels tres colors.
  2. En el cas de R, la transformació és més complicada ja que hem de obtenir un nombre i multiplicar-lo per B elevat a gamma, ja que Math.pow, significa "elevat".

Projecte espectofotometre amb Arduino, pyhthon i Pc

El codi d'Aruino es el següent:


//Creem 6 variables de tipus integer (int), vol dir que als pins del 12 al 17, els donem noms perquè així és més fàcil 
//entendre pinLedR que 12 es el pin en el que es conecta la pota R del led RGB. Aquestes definicions ajuden a entendre el codi
//com a humans i tenir més 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ó obligatoria de declarar on diem que els pinMode és el mode de conexió de cada pin, i que
//pot ser una sortida de informació (OUTPUT) perquè la llum surt cap a fora en el cas de pinLedR, pinLedG, pinLedB, pinLedUV,
//pinLedIR. En el cas del sensor LDR és un INPUT, que vol dir que la informació del exterior es transmessa cap a l'interior (llum).
void setup() {
pinMode(pinLedR, OUTPUT);
pinMode(pinLedG, OUTPUT);
pinMode(pinLedB, OUTPUT);
pinMode(pinLedUV, OUTPUT);
pinMode(pinLedIR, OUTPUT);

pinMode(pinLDR, INPUT);

Serial.begin(9600); // Inicia la comunicació sèrie a 9600 bauds
}

void loop() {
if (Serial.available() > 0) {
//La comunicació serie es a traves d'un cable que antigament s'anomenava o RS232 que tenia 9 pins, alguns dels quals eren per
  transmetre infotrmació tipus duplex. Això vol dir que envia la informació de l'ordinador a l'arduino i a l'inrevés. Internament
  l'arduino i altres microcontroladors tenen, actualment, connexions físiques i protocols de software RS232. El USB té 4 pins, 
  els dos als extrems són l'alimentació, per donar corrent (una dona càrrega positiva i l'altre és "el terra"), els altres dos pins
  que es troben al centre transportan l'informació: un cap a dintre de l'ordinador i altre cap a fora. Serial.aviable és un métode
  aviable que significa disponible, que apliquem per la sintaxi del punt a una classe serial (en altres llenguatges hauriem de crear
  un objecte es a dir Serial (en majuscules puc sospitar que es tracta d'un tipus de classe) serial; o serial=new Serial(); ). El
  mètode aviable només acepta dos resultats major a 0 o igual a 0, si és igual significa que no està conectat o dona un error, i si
  és major vol dir que és capaç de rebre un caràcter ASCII. 
  
char comanda = Serial.read(); // Llegeix la comanda enviada pel port sèrie
//La comanda és un caràcter perquè ho definim així i perquè el port serial o USB envia caràcters ASCII, i el port serial esta rebent pel mètode read caràcter que esta llegint.

switch(comanda) {
case ‘I’: // Encén o apaga el LED infraroig i llegeix el sensor LDR
digitalWrite(pinLedIR, !digitalRead(pinLedIR)); //true= no true. Es fa el contrari del que s'indica
llegirLDR();
break;
case ‘U’: // Encén o apaga el LED ultraviolat i llegeix el sensor LDR
digitalWrite(pinLedUV, !digitalRead(pinLedUV));
llegirLDR();
break;
//Si pressiono la tecla "I" enviara el caràcter I a través del cable mitjançant les instruccions serialAviable i serialRead i quan
arribi la I a l'arduino, anirà al processador de l'Arduino AVR i trobarà aquest codi que diu "case" i que significa que si es 
produeix apretant una I ha de fer un digitalWrite o encentre el LED infraroig. Passarà el mateix amb la tecla "U", però en comptes
d'encendre el LED infraroig encendrà el LED ultraviolat. A més de encendre els LED també els apagarà en el cas de que estiguin
encessos amb l'instrucció !, per últim en amdós casos també llegirà els LDR perquè hem cridat la funció llegirLDR();.

case ‘R’: // Controla el LED RGB i llegeix el sensor LDR
int r = Serial.parseInt();
int g = Serial.parseInt();
int b = Serial.parseInt();
//El LED RGB no es pot encendre com els LEDs anterior perquè té 16milions de combinacions, al ser 255 tons vermells múltiplicats per
255 blaus i verds. Hem d'indicar un valor concret que pugi ser introduït per l'usuari, i amb SerialParceInt agafa aquest valor. Si 
és un caràcter o número decimal el transforma en un número int o integer, o número sencer. Amb Serial l'envia a l'Arduino i
l'emmagatzema cada número en una variable sencera anomenada r, g, o b.

analogWrite(pinLedR, r); // Controla el LED vermell
analogWrite(pinLedG, g); // Controla el LED verd
analogWrite(pinLedB, b); // Controla el LED blau
//La variable enmmagatzemada r,g i b correspon a un valor entre 0 i 255 introduït en les 3 instruccions anterior amb analogWrite per
encendre cada LED. La diferència entre digitalWrite que utilitzavem per al LED ultraviolat e infraroig anterior i analogWrite que
estem utilitzant en LED RGB és que el digitalWrite i l'analogWrite és que la pimera és una funció digital en la qual només es
possible fer 2 funcions (0 o 1 o LOW i HIGH) i la segona permet 255 valors. Les dues funcions tenen en comú que tenen dos parámetres
o arguments entre parentèsis, el primer paràmetre és el número de pin on està conectat, per exemple el LED vermell (pota vermella
del LEDRGB) és pinLdr que és el mateix que escriure el número 12 i el segon paràmetre és r que pot ser 0 o 1, o 0 a 255 i és
introduït per l'usuari que ens diu l'intensitat en que s'encendrà. De 0 a 255 és una tecnología que realment no és analògica, sinó
PWM. Per exemple, quan escric 127 esta a la meitat de l'intensitat màxima, perquè? Perquè el que observo és el LED menys intens,
però realment que pasa esque la metitat del temps s'esta apagant i l'altra meitat encenent constantment i ràpidament (en milisegons)
(0001000100010001). Això fa que no pugem veure que s'apaga. 

llegirLDR();
break;
}
}
// Altres parts de la teva lògica del programa
}

void llegirLDR() {
int valorLDR = analogRead(pinLDR);
Serial.print(“Valor LDR: “);
Serial.println(valorLDR);
}

Aquest son els pasos a seguir informàticament