L'objectiu es comprendre com funciona la llum mitjançant microcontroladors i programació i en el meu efecre mims a través de leds de diferents colors, vermell, verd, groc, i blanc. També leds RGVNeocities.
El procediment per construïr un espectrofòmetre consta de les seguents 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 | FIELD5 | Font | FIELD7 |
---|---|---|---|---|---|---|
Raquel Albarrán | 612nm (1) | 650nm | 630nm (3) | |||
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 |
pd: Si | |
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 converrteix-la en RGB en la següent linia
En aquesta immatge podem veure la relació entre la ona i el color.
El codi anterior que trnsforma 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 propeitat 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 s una propeietat molt important ja que es com el DNI i el cridarem en getElementById
<>La paraula button crea un botó de forma automàtica que té una propietat o atribut anomenada onlick que està 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), onsubmit (quan envío un formulari).
El contigut del botó s'escriu abans de 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 transformar un valor que donem nosalatres inicialment , en un altre diferent. Em 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 aquest cas convertir la longitud d'ona i posa convertWaveLength(), en camelCase, i posem un parentesis but perquè no depen de peràmetres o arguments.
Dins de la funció tenim diversas instruccions agrupades en una clau
Les primeres 5 línies de la funció defineixen constant locals perquè s'apliquen dins de la funció i no afecten a tot el codi, a diferència de les constant globals que es posen fora de les funcions i afectan a tot el codi ( constant PI= 3,14;).
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 intruduït com a nm està fora de marges no facis res que vol dir return 0
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;
}
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);
}
}
El codi d'arduino és el següent:
// Creem 6 variables de tipu 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 es conecta la pota R del Led RGB. Aquestes definicions ajuden a entendre el codi els humanos
// 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 pinedR,pinedG, pinedB, pinedUV, pinedIR. En el cas del sensor LDR és un INPUT, vol
dir que entre 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. Elr Arduin UNO es comuniquen
a 9600 bits per segon y els ESP-32 53 es comuniquen a 11
Serial.begin(9600); // Inicia la comunicació sèrie a 9600 bauds
}
void loop() {
if (Serial.available() > 0) {
char comanda = Serial.read(); // Llegeix la comanda enviada pel port sèrie
// La comunucació sèrie és a través d'un cable que antiguament s'anomenava o RS232 que tenia 9 pins, dels 9 pins algúns eren pero trasnemtre
informació tipus dúplex que vol dir que envia informació des de l'ordinador a l'arduino i a l'inreves. Internament el arduino i altres micrcontrolador
internament també tenen connexions fisiques i protocols de sofware RS232.El USB té 4 pins, els dos més allunyats dels centres són d'alimentació, per
donar corrent ( una dona càrrega positiva i l'altre és el terra), els dos pins del centre un circula l'informació cap a dontre de l'ordinador i l'altre cap a fora. Serial.available és un mètode available que significa disponibeque apliquem per sintaxi del punt a una classe Serial. ( En altres lebguatges hauriem de crear un objecta 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 o està conectat i dona error, i si és mayor a 0 significa que és capaz de rebre i caracter ASCII.
char comanda= Serial.read(); // Llegueix 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 caraters ASCII, i el port serial està rebent pel mètode read caracters que està llegint.
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;
// Si pressiono la tecla "I" enviara el caràcter I a traves del cable mitjançant les instruccions saerialavalabel i serialread,i quan arribi la I a l'Arduino anirà al prosoccesador de l'Arduino AVR i trobarà aquest codi que diu case I que significa que si es produeix aparentant una I ha de fer un digitalwrite o encendre el LED infraroig. Passarà el matix amb el tecla 'U', però en contes de encendre el LED infraroig encendrà el LED ultraviolat. Amés de encendre els LED els apagarà si estan encessos amb l'instrucció !, per últim en els dos casos també 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 anteriors peroquè té 16 millions de combinacions, perquè són 255 vermells multiplicats per 255 blaus. Hem de posar un valor concret que pot ser introduït per l'usuari i amb SerialparceInt agafa el valor introduït per l'usuari i si és un caracter o un número decimal el transforma en un número int o numero cence, i amb Serial l'envia a l'Arduino i emmagatzema cada número rn una variable sencera nomenada 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 emmagatzemada r, g i b correspón a un valor entre 0 i 255 que intriduint en las 3 instrsuccions anteriors amb analogWrite que utilitzaven per el LED ultraviolat e infraroig anterior i analogWrite que estem utilitzant en LED RGB és que funció digital que només es possible fer 2 funcions (0 o 1) o LOW i HICH. En canvi analogWrite permet fer 255 valors. Les dues funcions tenen en comú que tenen dos paràmetres o arguments entre parentesis, el primer paràmetre és el numero de pin on està conectat,per exemple el LED varmell (pota vermella del LedRGB) por ser pinLedr, 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 sencendrà. De 0 a 255 és una tecnología que realment no és analógica,sino PWM.Per exemple quan escric 127 a la mitad de la intensitat màxima, perquè?Realment el que observo és el LED menys intens, però el que esta pasant es que la meitat del temps s'esta apagant i l'altre meitat encenen de forma molt ràpida 01010101. Per exemple quan escrivim 64 es repesentaria com una quarta part de la inensitat màxima,aleshores seria 0001000100010001 a tota velocitat i no veiem que s'apaga, perquè l'ordre de temps és milisegons i el nostre ull no l'observa. Per últim amb 190 seria tres quarts encesos 1110111011101110. El valor 0 analógic seria 0000000000 y el valor 255 seria 1111...
llegirLDR();
break;
}
}
// Altres parts de la teva lògica del programa
}
void llegirLDR() {
int valorLDR = analogRead(pinLDR);
Serial.print(“Valor LDR: “);
Serial.println(valorLDR);
}
//
L'objectiu és comprendre com funciona la llum mitjançant microcontroladors i programació. En el meu cas, és la transmissió de la llum a través de colorants de diferents colors.
Aquests són els passos a seguir informaticament:
float sensorValue;
sensorValue = analogRead(A0);
sensorVoltage = sensorValue/1024*5.0;
Primer de tot hem de crear una variable anomenada sensorValue i per crear-la utilitezem la istruccio float sensorValue;
//Això crearà un gran espai de memòria capaç d’emmagatzemar un número decimal, també conegut com a “floating point number” o número amb coma flotant. Aquest espai de memòria el pots anomenar com vulguis. Si l’anomenes valorSensor en castellà o català, només ho entendríem aquí.
El posem en anglès en estil camelCase o lletra de camell. Hi ha altres estils com snake_case,, kebab-,PascalCase. És a dir, la variable que emmagatzemarà els valors del sensor pot anomenar-se en els estils anteriors com sensorValue (camelCase), sensor_value (snake_case), sensor-value (kebab-case), SensorValue (PascalCase). Sempre s’ha de veure el mateix estil en un codi i el més utilitzat és el camelCase.
És important el punt i coma al final de cada línia perquè indica que l’instrucció s’ha acabat.
En els microcontroladors petits que tenen molt poca memòria (Arduina UNO 16kB molt poc comparat amb 512kB del ESP32-S3) podrien gastar menys memòria definint variables més petites que números decimals, com per exemple números enters. En aquest darrer cas seria int sensorValue; perquè int significa “integer number” o número sencer i accepta 5 digits ( 5 espais de memòria)pero només fins al número 64000 o 32000 i 1023 està dintre del marge.
Si tenim una variable float, guants digits guarda a la petita memòria del microcontrolador?
Com podemo veure a la taula. posa que float acpeta númers de fins a 3.4028235E+38, que vol dir 3.402835*10 38, és a dir 38 espais de memòria disponibles per aquesta variable.
Si en comptes d'un senor 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 255es podria fer servir per una sortida analògica PWM de 8 bits, però estem d'entrades analògiques, de sensors.
En el cas de arduino UNO, la velocitat de mstreig 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àxim és de 2 MHz, (200000 de mostres per segon) però realment s'aprofita només 1000 per segon via wifi. Altres tipus de variable que consumeixen molt poc memòria es Boolean. Boolean ve del nom d'un senyor que va inventar àlegbra 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ó co per exemple pressionar una teclaChar es un altre tipus de variable, que vol dir caràcter i és compatible amb arduino, i que inclou els caràcters ASCIII, 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+1*26+1*25+0*24+0*23+0*22+0*21+0*20=0+64+32+0+0+0+0+1= 97
En el cas de 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àxim és de 2MHz, (2000000 de mostre per segon) peró h2relament s'aprofita només 1000nper segon,via wifi.Aquest valors ta alts són teòrics
const int uvLEDPin = 5;// Pin digital per al LED UV
const in uvSensorPin = 11; // Pin analògic per al senosr UV
Al principi de tot codi sempre hi ha les constants i les variables que utilitzarem. En aquest cas tot són constants globals i no hi ha cap biblioteca inicial importada. Una constant global vol dir que afecta totes les funcions de tot el codi. En canvi una variable local està definida dins d'una funció i no la podem cridar desde fora de la funció. Les constants signifiquen que jo en comptes d'escriure el nombre 5 he d'escriure uvLEDPin, i en comptes d'escriure 11 escric uvSensorPin, fent el codi molt més llarg, però més comprensible per un humà, perquè s'enten molt millor si és un sensor o un led ultravioleta quejo connecto. Normalment es posa en anglès camelCase.
void setup() {
pinMode(uvLEDPin, OUTPUT);
Serial.begin(9600);
}
El void setup és una funció obligatoria del programa arduino i significa la configuració del hardware, o maquinari del propi arduino. Ens diu en primer lloc si els pins que tenim connectats són entrades o sortides, amb l'argument OUTPUT, si és una sortida, o argument INPUT, si és una entrada. Ens hem d'adonar que pinMode és una funció predefinida d'arduno que accepta dos arguments. El primer és el número o nom del pin, i el segon és si és una entrada o sortida. Serial.begin és un mètode construït amb la sintaxi del punt, això vol dir que Serial és un objecte predefinit de la classe Serial
void loop() {
// Encén el LED UV
//digitalWrite(uvLEDPin, 80);
analogWrite(uvLEDPin, 80);
// Mesura el valor del sensor UV
int uvValue = analogRead(uvSensorPin);
// Imprimeix el valor a la consola sèrie
Serial.print("UV Value: ");
Serial.println(uvValue);
// Apaga el LED UV
//digitalWrite(uvLEDPin, LOW);
// Espera un temps abans de fer la següent mesura
delay(1000);
}
Per exemple el codi seguent utilitza una entrada analògica de 12 bits d'ESP32-S3 i on esta conectat un sensor UV anomenat GUVA-S12