Contador Geiger

          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)
--init.lua
wifi.setmode(wifi.STATION);
print('set mode=STATION (mode='..wifi.getmode()..')')
print('MAC: ',wifi.sta.getmac())
print('chip: ',node.chipid())
print('heap: ',node.heap())
wifi.sta.config("MiSSID","MiClave");
wifi.sta.setip({ip="192.168.1.85",netmask="255.255.255.0",gateway="192.168.1.1"})

dofile("interrupcion.lua")
tmr.alarm(0, 10000, 1, function() --print("hola")  --1000000
--print(wifi.sta.getip())
wifi.sta.connect()
end)
--pantalla.lua
i=1
e=13
local tempvi=0
local ctop=1
-- setup I2c and connect display
function init_i2c_display()
     i2c.setup(0, 5, 6, i2c.SLOW)  --SCL pin6 GPIO12 y SDA pin5 GPIO14
     disp = u8g.ssd1306_128x64_i2c(0x3c)
end
init_i2c_display()
--disp:setFont(u8g.font_6x10)  --fuentes disponibles con este firmware
--disp:setFont(u8g.font_fub20)  --disp:setFont(u8g.font_fub30)
--disp:setScale2x2()
disp:setFontRefHeightExtendedText()
disp:setDefaultForegroundColor()
disp:setFontPosTop()

function fgrafica()
  disp:setFont(u8g.font_chikita)
  disp:drawStr( 0, 64, "10")  --left,top
  disp:drawStr( 0, 44, "30")  --left,top
  disp:drawStr( 0, 24, "50")  --left,top
  disp:drawStr( 0, 4, "70")  --left,top
  
  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
 
--tmr.alarm(3, 55000, 1, function()
  disp:firstPage()
  repeat
   fgrafica()
  until disp:nextPage() == false 
--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.
           Por último un video del sistema

Menu