Contador Geiger con tubo SBM-20 que muestra en pantalla y almacena en la Web las cuentas cada minuto (CPM) con gráficas Esta pensado para monitorizar la radiación de forma continua a lo lardo del día ya que cuenta y almacena los "click" por minuto, aunque tambien puede ser útil en forma de detector por medio del sonido en el zumbador y el LED incorporado.
El sistema consta de una etapa elevadora de tensión hasta 400 voltios que requiere el tubo Geiger SBM-20 para funcionar y por otro de un microprocesador para la gestión de los datos. Veamos el esquema
El circuito integrado MC34063 produce una oscilación que a través de MOSFET IRF840 pasa por la bobina L1 dandonos los 400v necesarios. El diodo 1N4934 debe ser de conmutación rapida o tipo Schottky. La bobina L1 la tenia hecha de otros montajes y es de 500 vueltas sobre nucleo de ferrita. Pueden ensayarse ya construidas de un valor como el señalado. El SBM-20 tiene señalado el positivo que debe orientarse hacia R6. En la salida marcada Arduino hay un pico de unos 4-5 voltios por cada particula que detecta el tubo.
Aunque esta marcado Arduino, en realidad esta conectado a un ESP8266 que nos permite contar los pulsos, gestionar una pequeña pantalla OLED y mandar los datos a una página en PHP alojada en mi NAS Synalogy
El circuito esta montado en una placa de pistas. Hay que tener cuidado con la parte de alta tensión ya que se produce un arco entre pistas que da como resultado la inmediata destrucción del circuito integrado.
Efecto que sufrieron dos de ellos hasta que descubrí la causa.
Hay pues que eliminar las pistas de alrededor de los 400v, tal como se muestra en el esquema.
Unas fotos del montaje terminado.
El sistema lo controla un ESP8266 que nos permite conexión Wifi y potencia de microprocesador. Está programado en LUA. Recibe los pulsos del tubo por el pin 2 (GPIO4) por medio de una interrupción, cuenta los que hay en cada minuto y los manda al programa en PHP para su visualización en Web. Al mismo tiempo va creando una gráfica en el display (128x64) que ocupa dos horas y va marcando el valor máximo en este periodo.
El programa LUA está en tres partes: init.lua; interrupcion.lua y pantalla.lua. ¡Atención! Para que funcione el display es necesario compilar un nuevo firm de LUA que incluya la libreria u8g. Esto es muy fácil hacerlo en esta página http://nodemcu-build.com/
--interrupcion.lua local pin = 2 --GPIO4 CPM=1 maxCPM=0 arrayCPM={} valor="" --vi=1 for vi=1,99,1 do arrayCPM[vi]=0 --relleno el array para evitar error por valor nulo end vi=1 gpio.mode(1,gpio.OUTPUT) --GPIO5 gpio.mode(0,gpio.OUTPUT) --GPIO16
function onChange (level) --se llama en cada interrupcion gpio.write(1,gpio.HIGH) --hace el click en el zumbador gpio.write(0,gpio.LOW) --Blink LED CPM=CPM+1 gpio.write(1,gpio.LOW) gpio.write(0,gpio.HIGH) end tmr.alarm(1, 60000, 1, function() --print("hola") --60000 = 1 minuto print('Pulsos por minuto: '..CPM) valor=(tostring(CPM)) --no se porque no admite el valor numerico y en otros programas si. Cagonto. --Abre conexion conn = nil conn = net.createConnection(net.TCP, 0) conn:connect(80,'192.168.1.48') conn:on("receive", function(conn, payload) success = true print(payload) end) conn:on("connection", function(conn, payload) print('\nConnected') conn:send("GET /consumovatios/src/consumo/procesarRa.php?dataRadio="..valor .." HTTP/1.1\r\n" .."Host: 192.168.1.48\r\n" .."Connection: keep-alive\r\nAccept: */*\r\n\r\n") end)
-- print('Pulsos por minuto: '..CPM) if (CPM > maxCPM) then maxCPM=CPM end
vi=vi+1 -- arrayCPM[vi]=math.random(70) --Prueba sin tubo geiger arrayCPM[vi]=CPM -- print('Pulsos por minuto: '..arrayCPM[vi]) -- print('vi: '..vi) -- vi=vi+1 dofile("pantalla.lua") if (vi > 97) then for vi=1,99,1 do arrayCPM[vi]=0 --relleno el array para evitar error por valor nulo y limpia pantalla end vi=1 end CPM=1 --para evitar posible division por cero end) gpio.mode(pin, gpio.INT) --Inicializa interrupcion en pin 2 GPIO4 gpio.trig(pin, 'up', onChange)
tempvi=vi for vi=2,97,1 do ctop=(74-arrayCPM[vi]) --pone el cero a -X en la base del display (65+X) disp:drawVLine(e, ctop, arrayCPM[vi]); --left,top,height e=e+1 end vi=tempvi e=13 disp:setFont(u8g.font_6x10) disp:setFont(u8g.font_fub20) disp:drawStr( 50, 19, tostring(maxCPM)) --left,top end
Unas fotos del montaje final y una gráfica del conteo de parte de un día
A la izquierda el display. Se crea una linea vertical cada minuto, caben dos horas y nos marca el máximo en ese tiempo. Despues se borra y comienza un nuevo ciclo. Por supuesto en la Web se almacenan las 24h. Hay un LED para cada pulso y un zumbador (desconectado).
Es curioso que cada minuto, la radiación (los click) tienen bastantes variaciónes, pero al cabo de los días la media diaria es sorprendentemente estable.